Whiz Tools

Conversor de Timestamp Unix

الطابع الزمني يونكس هو عدد الثواني منذ 1 يناير 1970 (UTC)

Data e Hora Convertidas

Conversor de Timestamp Unix

Introdução

Um timestamp Unix (também conhecido como tempo POSIX ou tempo Epoch) é um sistema para descrever um ponto no tempo. É o número de segundos que se passaram desde 1 de janeiro de 1970 (meia-noite UTC/GMT), não contando os segundos intercalares. Timestamps Unix são amplamente utilizados em sistemas computacionais e linguagens de programação, pois fornecem uma representação compacta e independente de linguagem de um momento específico no tempo.

Este conversor permite que você transforme um timestamp Unix em um formato de data e hora legível por humanos. Ele suporta tanto formatos de 12 horas (AM/PM) quanto de 24 horas para acomodar diferentes preferências regionais e pessoais.

Como Funcionam os Timestamps Unix

Timestamps Unix são calculados como o número de segundos desde o Epoch Unix (1 de janeiro de 1970, 00:00:00 UTC). Isso os torna particularmente úteis para calcular diferenças de tempo e para armazenar datas em um formato compacto.

A conversão matemática de um timestamp Unix para uma data do calendário envolve várias etapas:

  1. Comece com o Epoch Unix (1 de janeiro de 1970, 00:00:00 UTC)
  2. Adicione o número de segundos no timestamp
  3. Leve em conta anos bissextos, variações nos comprimentos dos meses e outras complexidades do calendário
  4. Aplique ajustes de fuso horário, se necessário

Por exemplo, o timestamp Unix 1609459200 representa sexta-feira, 1 de janeiro de 2021, 00:00:00 UTC.

A fórmula de conversão pode ser expressa como:

Data=Epoch Unix+Timestamp (em segundos)\text{Data} = \text{Epoch Unix} + \text{Timestamp (em segundos)}

A maioria das linguagens de programação e sistemas operacionais fornece funções embutidas para lidar com essa conversão, abstraindo os cálculos complexos do calendário.

Opções de Formato de Hora

Este conversor oferece duas opções de formato de hora:

  1. Formato de 24 horas (às vezes chamado de "horário militar"): As horas variam de 0 a 23, e não há designação AM/PM. Por exemplo, 15:00 é representado como 15:00.

  2. Formato de 12 horas: As horas variam de 1 a 12, com AM (ante meridiem) para horários da meia-noite ao meio-dia, e PM (post meridiem) para horários do meio-dia à meia-noite. Por exemplo, 15:00 no formato de 24 horas é representado como 3:00 PM.

A escolha entre esses formatos é, em grande parte, uma questão de convenção regional e preferência pessoal:

  • O formato de 24 horas é comumente usado na maior parte da Europa, América Latina e Ásia, assim como em contextos científicos, militares e médicos em todo o mundo.
  • O formato de 12 horas é prevalente nos Estados Unidos, Canadá, Austrália e alguns outros países de língua inglesa para uso cotidiano.

Casos Limite e Limitações

Ao trabalhar com timestamps Unix, é importante estar ciente de vários casos limite e limitações:

  1. Timestamps negativos: Estes representam datas antes do Epoch Unix (1 de janeiro de 1970). Embora matematicamente válidos, alguns sistemas podem não lidar corretamente com timestamps negativos.

  2. O Problema do Ano 2038: Timestamps Unix são frequentemente armazenados como inteiros com sinal de 32 bits, que irão transbordar em 19 de janeiro de 2038. Após esse ponto, sistemas de 32 bits não serão capazes de representar horários corretamente, a menos que modificados para usar um tipo de inteiro maior.

  3. Timestamps extremamente grandes: Datas muito distantes no futuro podem não ser representáveis em alguns sistemas, ou podem ser tratadas de forma inconsistente.

  4. Segundos intercalares: O tempo Unix não leva em conta os segundos intercalares, que são ocasionalmente adicionados ao UTC para compensar a rotação irregular da Terra. Isso significa que o tempo Unix não está precisamente sincronizado com o tempo astronômico.

  5. Considerações de fuso horário: Timestamps Unix representam momentos em UTC. A conversão para o horário local requer informações adicionais de fuso horário.

  6. Horário de Verão: Ao converter timestamps para o horário local, as complexidades das transições do Horário de Verão devem ser consideradas.

Casos de Uso

Timestamps Unix são usados em inúmeras aplicações em computação e gerenciamento de dados:

  1. Registros de Banco de Dados: Timestamps são comumente usados para registrar quando entradas foram criadas ou modificadas.

  2. Desenvolvimento Web: Cabeçalhos HTTP, cookies e mecanismos de cache frequentemente utilizam timestamps Unix.

  3. Arquivos de Log: Logs de sistema normalmente registram eventos com timestamps Unix para uma ordenação cronológica precisa.

  4. Sistemas de Controle de Versão: Git e outros sistemas de controle de versão usam timestamps para registrar quando os commits foram feitos.

  5. Respostas de API: Muitas APIs da web incluem timestamps em suas respostas para indicar quando os dados foram gerados ou quando os recursos foram modificados pela última vez.

  6. Sistemas de Arquivos: Horários de criação e modificação de arquivos são frequentemente armazenados como timestamps Unix.

  7. Gerenciamento de Sessões: Aplicações web usam timestamps para determinar quando as sessões de usuários devem expirar.

  8. Análise de Dados: Timestamps fornecem uma maneira padronizada de trabalhar com dados temporais em aplicações de análise.

Alternativas

Embora timestamps Unix sejam amplamente utilizados, existem formatos alternativos de representação de tempo que podem ser mais apropriados em certos contextos:

  1. ISO 8601: Um formato de string padronizado (por exemplo, "2021-01-01T00:00:00Z") que é legível por humanos, mantendo a ordenação. É frequentemente preferido para intercâmbio de dados e aplicações voltadas para o usuário.

  2. RFC 3339: Um perfil de ISO 8601 usado em protocolos de internet, com requisitos de formatação mais rigorosos.

  3. Formatos legíveis por humanos: Strings de data localizadas (por exemplo, "1 de janeiro de 2021") são mais apropriadas para interação direta com o usuário, mas são menos adequadas para computação.

  4. FILETIME da Microsoft: Um valor de 64 bits representando o número de intervalos de 100 nanosegundos desde 1 de janeiro de 1601, usado em sistemas Windows.

  5. Número do Dia Juliano: Usado em astronomia e algumas aplicações científicas, contando dias desde 1 de janeiro de 4713 a.C.

A escolha do formato de tempo depende de fatores como:

  • Precisão requerida
  • Necessidades de legibilidade humana
  • Restrições de armazenamento
  • Compatibilidade com sistemas existentes
  • Faixa de datas que precisam ser representadas

História

O conceito de tempo Unix originou-se com o desenvolvimento do sistema operacional Unix nos Laboratórios Bell no final dos anos 1960 e início dos anos 1970. A decisão de usar 1 de janeiro de 1970 como o epoch foi um tanto arbitrária, mas prática para a época—era recente o suficiente para minimizar os requisitos de armazenamento para datas de interesse, mas distante o suficiente no passado para ser útil para dados históricos.

A implementação original usou um inteiro com sinal de 32 bits para armazenar o número de segundos, que era adequado para a expectativa de vida dos sistemas Unix na época. No entanto, essa decisão levou ao Problema do Ano 2038 (às vezes chamado de "Y2K38" ou "Bug do Milênio Unix"), uma vez que inteiros com sinal de 32 bits só podem representar datas até 19 de janeiro de 2038 (03:14:07 UTC).

À medida que Unix e sistemas semelhantes ao Unix ganharam popularidade, o timestamp Unix se tornou um padrão de fato para representar tempo em computação. Foi adotado por inúmeras linguagens de programação, bancos de dados e aplicações, estendendo-se muito além de seu ambiente Unix original.

Sistemas modernos estão cada vez mais usando inteiros de 64 bits para timestamps, o que estende a faixa representável para aproximadamente 292 bilhões de anos em ambas as direções a partir do epoch, efetivamente resolvendo o Problema do Ano 2038. No entanto, sistemas e aplicações legados ainda podem ser vulneráveis.

A simplicidade e utilidade do timestamp Unix garantiram sua relevância contínua, apesar do desenvolvimento de formatos de representação de tempo mais sofisticados. Ele permanece um conceito fundamental na computação, sustentando grande parte de nossa infraestrutura digital.

Exemplos de Código

Aqui estão exemplos de como converter timestamps Unix para datas legíveis por humanos em várias linguagens de programação:

// Conversão de timestamp em JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Cria um novo objeto Date (JavaScript usa milissegundos)
  const date = new Date(timestamp * 1000);
  
  // Opções de formatação
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Converte para string usando formatação de local
  return date.toLocaleString(undefined, options);
}

// Exemplo de uso
const timestamp = 1609459200; // 1 de janeiro de 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // Formato de 24 horas
console.log(convertUnixTimestamp(timestamp, true));  // Formato de 12 horas
# Conversão de timestamp em Python
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Converte timestamp Unix para objeto datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formata a string de data
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # Formato de 12 horas com AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # Formato de 24 horas
    
    return date.strftime(format_string)

# Exemplo de uso
timestamp = 1609459200  # 1 de janeiro de 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # Formato de 24 horas
print(convert_unix_timestamp(timestamp, True))   # Formato de 12 horas
<?php
// Conversão de timestamp em PHP
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // String de formatação
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // Formato de 12 horas com AM/PM
        : 'l, F j, Y H:i:s';   // Formato de 24 horas
    
    // Converte e formata a data
    return date($formatString, $timestamp);
}

// Exemplo de uso
$timestamp = 1609459200; // 1 de janeiro de 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // Formato de 24 horas
echo convertUnixTimestamp($timestamp, true) . "\n";  // Formato de 12 horas
?>
// Conversão de timestamp em Java
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class UnixTimestampConverter {
    public static String convertUnixTimestamp(long timestamp, boolean use12Hour) {
        // Converte timestamp Unix para Instant, depois para LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Cria formatador com base no formato desejado
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formata a data
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1 de janeiro de 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // Formato de 24 horas
        System.out.println(convertUnixTimestamp(timestamp, true));  // Formato de 12 horas
    }
}
// Conversão de timestamp em C#
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Converte timestamp Unix para DateTime
        // Timestamps Unix são segundos desde 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // String de formatação com base na preferência de 12 horas ou 24 horas
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // Formato de 12 horas com AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // Formato de 24 horas
        
        // Retorna string de data formatada
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1 de janeiro de 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // Formato de 24 horas
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // Formato de 12 horas
    }
}
# Conversão de timestamp em Ruby
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Converte timestamp Unix para objeto Time
  time = Time.at(timestamp)
  
  # Formata com base na preferência de 12 horas ou 24 horas
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # Formato de 12 horas com AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # Formato de 24 horas
  end
end

# Exemplo de uso
timestamp = 1609459200  # 1 de janeiro de 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # Formato de 24 horas
puts convert_unix_timestamp(timestamp, true)   # Formato de 12 horas
// Conversão de timestamp em Go
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Converte timestamp Unix para Time
    t := time.Unix(timestamp, 0)
    
    // String de formatação com base na preferência de 12 horas ou 24 horas
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // Formato de 12 horas com AM/PM
    } else {
        formatString += "15:04:05"    // Formato de 24 horas
    }
    
    // Retorna tempo formatado
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1 de janeiro de 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // Formato de 24 horas
    fmt.Println(convertUnixTimestamp(timestamp, true))  // Formato de 12 horas
}
// Conversão de timestamp em Swift
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Cria Date a partir do timestamp Unix
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Cria DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Define estilo de hora com base na preferência de 12 horas ou 24 horas
    if use12Hour {
        formatter.timeStyle = .medium
        formatter.amSymbol = "AM"
        formatter.pmSymbol = "PM"
    } else {
        formatter.timeStyle = .medium
        formatter.dateFormat = formatter.dateFormat?.replacingOccurrences(of: "h:mm:ss a", with: "HH:mm:ss")
    }
    
    // Retorna data formatada
    return formatter.string(from: date)
}

// Exemplo de uso
let timestamp = 1609459200 // 1 de janeiro de 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // Formato de 24 horas
print(convertUnixTimestamp(timestamp, use12Hour: true))  // Formato de 12 horas
# Conversão de timestamp em R
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Converte timestamp Unix para datetime POSIXct
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formata com base na preferência de 12 horas ou 24 horas
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # Formato de 12 horas com AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # Formato de 24 horas
  }
  
  # Retorna string de data formatada
  format(date_time, format_string)
}

# Exemplo de uso
timestamp <- 1609459200  # 1 de janeiro de 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # Formato de 24 horas
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # Formato de 12 horas
% Conversão de timestamp em MATLAB
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Converte timestamp Unix para datetime MATLAB
    % Datas do MATLAB são dias desde 1900-01-01, com 1 = 1900-01-01
    % Timestamps Unix são segundos desde 1970-01-01
    
    % Primeiro converte para formato de data do MATLAB
    % 25569 é o número de dias entre 1900-01-01 e 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formata a data com base na preferência de 12 horas ou 24 horas
    if use12Hour
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy h:mm:ss AM/PM');
    else
        formattedDate = datestr(excelDate, 'dddd, mmmm dd, yyyy hh:mm:ss');
    end
end

% Exemplo de uso
timestamp = 1609459200;  % 1 de janeiro de 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % Formato de 24 horas
disp(convertUnixTimestamp(timestamp, true))   % Formato de 12 horas
' Conversão de timestamp em Excel VBA
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Converte timestamp Unix para data/hora do Excel
    ' Datas do Excel são dias desde 1900-01-01, com 1 = 1900-01-01
    ' Timestamps Unix são segundos desde 1970-01-01
    
    ' Primeiro converte para formato de data do Excel
    ' 25569 é o número de dias entre 1900-01-01 e 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formata a data com base na preferência de 12 horas ou 24 horas
    If use12Hour Then
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy h:mm:ss AM/PM")
    Else
        ConvertUnixTimestamp = Format(excelDate, "dddd, mmmm d, yyyy hh:mm:ss")
    End If
End Function

' Uso em uma planilha:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' Formato de 12 horas
' =ConvertUnixTimestamp(1609459200, FALSE) ' Formato de 24 horas

Tratamento de Casos Limite

Ao trabalhar com timestamps Unix, é importante lidar corretamente com casos limite. Aqui estão exemplos de como lidar com alguns casos limite comuns:

// Tratamento de casos limite em JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Verifica se o timestamp é válido
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Timestamp inválido";
  }
  
  // Verifica timestamps negativos (datas antes de 1970)
  if (timestamp < 0) {
    // Alguns navegadores podem não lidar corretamente com timestamps negativos
    // Use uma abordagem mais robusta para datas antes de 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Data inválida (antes de 1970)";
    }
  }
  
  // Verifica o problema do Y2K38 (para sistemas de 32 bits)
  const maxInt32 = 2147483647; // Valor máximo para inteiro com sinal de 32 bits
  if (timestamp > maxInt32) {
    // Considere usar BigInt para timestamps muito grandes em JavaScript moderno
    console.warn("Timestamp excede o limite de inteiro de 32 bits (problema Y2K38)");
  }
  
  // Prossegue com a conversão normal
  try {
    const date = new Date(timestamp * 1000);
    const options = {
      year: 'numeric',
      month: 'long',
      day: 'numeric',
      weekday: 'long',
      hour: use12Hour ? 'numeric' : '2-digit',
      minute: '2-digit',
      second: '2-digit',
      hour12: use12Hour
    };
    return date.toLocaleString(undefined, options);
  } catch (error) {
    return "Erro ao converter timestamp: " + error.message;
  }
}

Referências

  1. "Tempo Unix." Wikipedia, Wikimedia Foundation, https://pt.wikipedia.org/wiki/Unix_time

  2. "Problema do Ano 2038." Wikipedia, Wikimedia Foundation, https://pt.wikipedia.org/wiki/Problema_do_ano_2038

  3. Olson, Arthur David. "As Complexidades do Tempo Calendárico." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

  4. "ISO 8601." Wikipedia, Wikimedia Foundation, https://pt.wikipedia.org/wiki/ISO_8601

  5. "RFC 3339: Data e Hora na Internet: Timestamps." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., e Dennis M. Ritchie. "A Linguagem de Programação C." Prentice Hall, 1988.

Feedback