Whiz Tools

Conversor de Timestamp Unix

El timestamp Unix és el nombre de segons des de l'1 de gener de 1970 (UTC)

Data i Hora Convertides

Conversor de Timestamp Unix

Introducció

Un timestamp Unix (també conegut com a temps POSIX o temps Epoch) és un sistema per descriure un moment en el temps. És el nombre de segons que han passat des de l'1 de gener de 1970 (mitjanit UTC/GMT), sense comptar els segons intercalars. Els timestamps Unix s'utilitzen àmpliament en sistemes informàtics i llenguatges de programació, ja que proporcionen una representació compacta i independent de l'idioma d'un moment específic en el temps.

Aquest conversor et permet transformar un timestamp Unix en un format de data i hora llegible per a humans. Admet tant formats de 12 hores (AM/PM) com de 24 hores per acomodar diferents preferències regionals i personals.

Com Funcionen els Timestamps Unix

Els timestamps Unix es calculen com el nombre de segons des de l'Epoch Unix (l'1 de gener de 1970, 00:00:00 UTC). Això els fa particularment útils per calcular diferències de temps i per emmagatzemar dates en un format compacte.

La conversió matemàtica d'un timestamp Unix a una data del calendari implica diversos passos:

  1. Començar amb l'Epoch Unix (l'1 de gener de 1970, 00:00:00 UTC)
  2. Afegir el nombre de segons del timestamp
  3. Tenir en compte els anys de traspàs, les variacions en la longitud dels mesos i altres complexitats del calendari
  4. Aplicar ajustaments de zona horària si és necessari

Per exemple, el timestamp Unix 1609459200 representa divendres, 1 de gener de 2021, 00:00:00 UTC.

La fórmula de conversió es pot expressar com:

Data=Epoch Unix+Timestamp (en segons)\text{Data} = \text{Epoch Unix} + \text{Timestamp (en segons)}

La majoria dels llenguatges de programació i sistemes operatius proporcionen funcions integrades per gestionar aquesta conversió, abstraient les complexes càlculs del calendari.

Opcions de Format de Temps

Aquest conversor ofereix dues opcions de format de temps:

  1. Format de 24 hores (de vegades anomenat "hora militar"): Les hores van de 0 a 23, i no hi ha designació AM/PM. Per exemple, les 3:00 PM es representen com a 15:00.

  2. Format de 12 hores: Les hores van de 1 a 12, amb AM (ante meridiem) per als moments de mitjanit a migdia, i PM (post meridiem) per als moments de migdia a mitjanit. Per exemple, les 15:00 en format de 24 hores es representen com a 3:00 PM.

L'elecció entre aquests formats és en gran mesura una qüestió de convenció regional i preferència personal:

  • El format de 24 hores s'utilitza comunament a la majoria d'Europa, Amèrica Llatina i Àsia, així com en contextos científics, militars i mèdics a nivell mundial.
  • El format de 12 hores és prevalent als Estats Units, Canadà, Austràlia i alguns altres països de parla anglesa per a l'ús quotidià.

Casos Límit i Limitacions

En treballar amb timestamps Unix, és important ser conscient de diversos casos límit i limitacions:

  1. Timestamps negatius: Aquests representen dates abans de l'Epoch Unix (l'1 de gener de 1970). Si bé són matemàticament vàlids, alguns sistemes poden no gestionar correctament els timestamps negatius.

  2. El Problema de l'Any 2038: Els timestamps Unix sovint es desaven com a enters signats de 32 bits, que desbordaran el 19 de gener de 2038. Després d'aquest punt, els sistemes de 32 bits no podran representar els temps correctament a menys que es modifiquin per utilitzar un tipus d'enter més gran.

  3. Timestamps extremadament grans: Dates molt llunyanes en el futur poden no ser representables en alguns sistemes, o poden ser gestionades de manera inconsistent.

  4. Segons intercalars: El temps Unix no té en compte els segons intercalars, que s'afegeixen ocasionalment a UTC per compensar la rotació irregular de la Terra. Això significa que el temps Unix no està sincronitzat de manera precisa amb el temps astronòmic.

  5. Consideracions de zona horària: Els timestamps Unix representen moments en UTC. Convertir a l'hora local requereix informació addicional sobre la zona horària.

  6. Estalvi d'horari d'estiu: En convertir timestamps a l'hora local, cal tenir en compte les complexitats de les transicions de l'estalvi d'horari d'estiu.

Casos d'Ús

Els timestamps Unix s'utilitzen en nombroses aplicacions a través de la informàtica i la gestió de dades:

  1. Registres de bases de dades: Els timestamps s'utilitzen comunament per enregistrar quan es van crear o modificar les entrades.

  2. Desenvolupament web: Les capçaleres HTTP, les galetes i els mecanismes de memòria cau sovint utilitzen timestamps Unix.

  3. Fitxers de registre: Els registres del sistema solen enregistrar esdeveniments amb timestamps Unix per a un ordre cronològic precís.

  4. Sistemes de control de versions: Git i altres VCS utilitzen timestamps per enregistrar quan es van fer les confirmacions.

  5. Respostes d'API: Moltes API web inclouen timestamps en les seves respostes per indicar quan es va generar la dada o quan es van modificar els recursos.

  6. Sistemes de fitxers: Els temps de creació i modificació dels fitxers sovint es desaven com a timestamps Unix.

  7. Gestió de sessions: Les aplicacions web utilitzen timestamps per determinar quan les sessions d'usuari haurien d'expirar.

  8. Anàlisi de dades: Els timestamps proporcionen una manera estandarditzada de treballar amb dades temporals en aplicacions d'analítica.

Alternatives

Si bé els timestamps Unix s'utilitzen àmpliament, hi ha formats alternatius de representació del temps que poden ser més adequats en certs contextos:

  1. ISO 8601: Un format de cadena estandarditzat (per exemple, "2021-01-01T00:00:00Z") que és llegible per a humans mentre manté la capacitat de ser ordenat. S'utilitza sovint per a la intercanvi de dades i aplicacions orientades a l'usuari.

  2. RFC 3339: Un perfil d'ISO 8601 utilitzat en protocols d'internet, amb requisits de format més estrictes.

  3. Formats llegibles per a humans: Cadenes de data localitzades (per exemple, "1 de gener de 2021") són més adequades per a la interacció directa amb l'usuari, però són menys adequades per al càlcul.

  4. Microsoft FILETIME: Un valor de 64 bits que representa el nombre d'intervals de 100 nanosegons des de l'1 de gener de 1601, utilitzat en sistemes Windows.

  5. Número de dia Julià: Utilitzat en astronomia i algunes aplicacions científiques, comptant els dies des de l'1 de gener de 4713 aC.

L'elecció del format de temps depèn de factors com:

  • Precisió requerida
  • Necessitats de llegibilitat humana
  • Restriccions d'emmagatzematge
  • Compatibilitat amb sistemes existents
  • Rangs de dates que cal representar

Història

El concepte de temps Unix va originar-se amb el desenvolupament del sistema operatiu Unix a Bell Labs a finals dels anys 60 i principis dels anys 70. La decisió d'utilitzar l'1 de gener de 1970 com a època era una mica arbitrària però pràctica per a l'època: era recent prou per minimitzar els requisits d'emmagatzematge per a dates d'interès, però prou llunyana en el passat per ser útil per a dades històriques.

La implementació original utilitzava un enter signat de 32 bits per emmagatzemar el nombre de segons, que era adequat per a la vida útil esperada dels sistemes Unix en aquell moment. No obstant això, aquesta decisió va portar al Problema de l'Any 2038 (de vegades anomenat "Y2K38" o "El Bug del Mil·lenni Unix"), ja que els enters signats de 32 bits només poden representar dates fins al 19 de gener de 2038 (03:14:07 UTC).

A mesura que Unix i els sistemes similars a Unix van guanyar popularitat, el timestamp Unix es va convertir en un estàndard de facto per representar el temps en la informàtica. Va ser adoptat per nombrosos llenguatges de programació, bases de dades i aplicacions, ampliant-se molt més enllà del seu entorn original de Unix.

Els sistemes moderns utilitzen cada vegada més enters de 64 bits per a timestamps, cosa que amplia el rang representable a aproximadament 292 mil milions d'anys en ambdues direccions des de l'època, resolent efectivament el Problema de l'Any 2038. No obstant això, els sistemes i aplicacions llegats poden seguir sent vulnerables.

La simplicitat i utilitat del timestamp Unix han assegurat la seva continuïtat rellevància malgrat el desenvolupament de formats de representació del temps més sofisticats. Continua sent un concepte fonamental en la informàtica, fonamentant gran part de la nostra infraestructura digital.

Exemples de Codi

Aquí hi ha exemples de com convertir timestamps Unix a dates llegibles per a humans en diversos llenguatges de programació:

// Conversió de timestamp en JavaScript
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Crear un nou objecte Date (JavaScript utilitza mil·lisegons)
  const date = new Date(timestamp * 1000);
  
  // Opcions de format
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Convertir a cadena utilitzant formatatge de local
  return date.toLocaleString(undefined, options);
}

// Exemple d'ús
const timestamp = 1609459200; // 1 de gener de 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // Format de 24 hores
console.log(convertUnixTimestamp(timestamp, true));  // Format de 12 hores
# Conversió de timestamp en Python
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Convertir el timestamp Unix a objecte datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Format de la cadena de data
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # Format de 12 hores amb AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # Format de 24 hores
    
    return date.strftime(format_string)

# Exemple d'ús
timestamp = 1609459200  # 1 de gener de 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # Format de 24 hores
print(convert_unix_timestamp(timestamp, True))   # Format de 12 hores
<?php
// Conversió de timestamp en PHP
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Cadena de format
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // Format de 12 hores amb AM/PM
        : 'l, F j, Y H:i:s';   // Format de 24 hores
    
    // Convertir i formatar la data
    return date($formatString, $timestamp);
}

// Exemple d'ús
$timestamp = 1609459200; // 1 de gener de 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // Format de 24 hores
echo convertUnixTimestamp($timestamp, true) . "\n";  // Format de 12 hores
?>
// Conversió de timestamp en 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) {
        // Convertir el timestamp Unix a Instant, després a LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Crear formatador basat en el format desitjat
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Format de la data
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1 de gener de 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // Format de 24 hores
        System.out.println(convertUnixTimestamp(timestamp, true));  // Format de 12 hores
    }
}
// Conversió de timestamp en C#
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Convertir el timestamp Unix a DateTime
        // Els timestamps Unix són segons des de 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Cadena de format basada en la preferència de 12 hores o 24 hores
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // Format de 12 hores amb AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // Format de 24 hores
        
        // Retornar la cadena de data formatada
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1 de gener de 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // Format de 24 hores
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // Format de 12 hores
    }
}
# Conversió de timestamp en Ruby
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Convertir el timestamp Unix a objecte Time
  time = Time.at(timestamp)
  
  # Format basat en la preferència de 12 hores o 24 hores
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # Format de 12 hores amb AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # Format de 24 hores
  end
end

# Exemple d'ús
timestamp = 1609459200  # 1 de gener de 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # Format de 24 hores
puts convert_unix_timestamp(timestamp, true)   # Format de 12 hores
// Conversió de timestamp en Go
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Convertir el timestamp Unix a Time
    t := time.Unix(timestamp, 0)
    
    // Cadena de format basada en la preferència de 12 hores o 24 hores
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // Format de 12 hores amb AM/PM
    } else {
        formatString += "15:04:05"    // Format de 24 hores
    }
    
    // Retornar el temps formatat
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1 de gener de 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // Format de 24 hores
    fmt.Println(convertUnixTimestamp(timestamp, true))  // Format de 12 hores
}
// Conversió de timestamp en Swift
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Crear Date a partir del timestamp Unix
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Crear DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Establir l'estil de temps basat en la preferència de 12 hores o 24 hores
    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")
    }
    
    // Retornar la data formatada
    return formatter.string(from: date)
}

// Exemple d'ús
let timestamp = 1609459200 // 1 de gener de 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // Format de 24 hores
print(convertUnixTimestamp(timestamp, use12Hour: true))  // Format de 12 hores
# Conversió de timestamp en R
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Convertir el timestamp Unix a datetime POSIXct
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Format basat en la preferència de 12 hores o 24 hores
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # Format de 12 hores amb AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # Format de 24 hores
  }
  
  # Retornar la cadena de data formatada
  format(date_time, format_string)
}

# Exemple d'ús
timestamp <- 1609459200  # 1 de gener de 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # Format de 24 hores
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # Format de 12 hores
% Conversió de timestamp en MATLAB
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Convertir el timestamp Unix a datetime MATLAB
    % Les dates de MATLAB són dies des de 1900-01-01, amb 1 = 1900-01-01
    % Els timestamps Unix són segons des de 1970-01-01
    
    % Primer convertir a format de data d'Excel
    % 25569 és el nombre de dies entre 1900-01-01 i 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Format basat en la preferència de 12 hores o 24 hores
    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

% Exemple d'ús
timestamp = 1609459200;  % 1 de gener de 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % Format de 24 hores
disp(convertUnixTimestamp(timestamp, true))   % Format de 12 hores
' Conversió de timestamp en Excel VBA
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Convertir el timestamp Unix a data/hora d'Excel
    ' Les dates d'Excel són dies des de 1900-01-01, amb 1 = 1900-01-01
    ' Els timestamps Unix són segons des de 1970-01-01
    
    ' Primer convertir a format de data d'Excel
    ' 25569 és el nombre de dies entre 1900-01-01 i 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Format de la data basat en la preferència de 12 hores o 24 hores
    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

' Ús en una fulla de càlcul:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' Format de 12 hores
' =ConvertUnixTimestamp(1609459200, FALSE) ' Format de 24 hores

Gestió de Casos Límit

En treballar amb timestamps Unix, és important gestionar correctament els casos límit. Aquí hi ha exemples de gestió d'alguns casos límit comuns:

// Gestió de casos límit en JavaScript
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Comprovar si el timestamp és vàlid
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Timestamp invàlid";
  }
  
  // Comprovar timestamps negatius (dates abans de 1970)
  if (timestamp < 0) {
    // Alguns navegadors poden no gestionar correctament els timestamps negatius
    // Utilitzar un enfocament més robust per a dates abans de 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Data invàlida (abans de 1970)";
    }
  }
  
  // Comprovar el problema de Y2K38 (per sistemes de 32 bits)
  const maxInt32 = 2147483647; // Valor màxim per a enter signat de 32 bits
  if (timestamp > maxInt32) {
    // Considerar utilitzar BigInt per a timestamps molt grans en JavaScript modern
    console.warn("El timestamp supera el límit d'enters de 32 bits (problema de Y2K38)");
  }
  
  // Procedir amb la conversió 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 "Error convertint el timestamp: " + error.message;
  }
}

Referències

  1. "Temps Unix." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Unix_time

  2. "Problema de l'Any 2038." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Les Complexitats del Temps Calendrical." The Open Group, https://www.usenix.org/legacy/events/usenix01/full_papers/olson/olson.pdf

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

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

  6. Kernighan, Brian W., i Dennis M. Ritchie. "El Llenguatge de Programació C." Prentice Hall, 1988.

Feedback