Whiz Tools

Unix Tidsstempel Konverter

Unixové časové razítko je počet sekund od 1. ledna 1970 (UTC)

Konvertert Dato & Tid

Unix Tidsstempel Konverter

Introduksjon

Et Unix tidsstempel (også kjent som POSIX-tid eller Epoch-tid) er et system for å beskrive et tidspunkt. Det er antall sekunder som har gått siden 1. januar 1970 (midnatt UTC/GMT), uten å ta hensyn til skuddsekunder. Unix tidsstempler er mye brukt i datasystemer og programmeringsspråk, da de gir en kompakt, språk-uavhengig representasjon av et spesifikt øyeblikk i tid.

Denne konverteren lar deg transformere et Unix tidsstempel til et menneskelig lesbart dato- og tidsformat. Den støtter både 12-timers (AM/PM) og 24-timers tidsformater for å imøtekomme forskjellige regionale og personlige preferanser.

Hvordan Unix Tidsstempler Fungerer

Unix tidsstempler beregnes som antall sekunder siden Unix Epoch (1. januar 1970, 00:00:00 UTC). Dette gjør dem spesielt nyttige for å beregne tidsforskjeller og for å lagre datoer i et kompakt format.

Den matematiske konverteringen fra et Unix tidsstempel til en kalenderdato involverer flere trinn:

  1. Start med Unix Epoch (1. januar 1970, 00:00:00 UTC)
  2. Legg til antall sekunder i tidsstempelet
  3. Ta hensyn til skuddår, varierende månedslengder og andre kalenderkompleksiteter
  4. Bruk tidssonejusteringer om nødvendig

For eksempel representerer Unix tidsstempelet 1609459200 fredag 1. januar 2021, 00:00:00 UTC.

Konverteringsformelen kan uttrykkes som:

Dato=Unix Epoch+Tidsstempel (i sekunder)\text{Dato} = \text{Unix Epoch} + \text{Tidsstempel (i sekunder)}

De fleste programmeringsspråk og operativsystemer har innebygde funksjoner for å håndtere denne konverteringen, og abstraherer bort de komplekse kalenderberegningene.

Tidsformatalternativer

Denne konverteren tilbyr to tidsformatalternativer:

  1. 24-timers format (noen ganger kalt "militærtid"): Timer varierer fra 0 til 23, og det er ingen AM/PM-betegnelse. For eksempel, 15:00 representeres som 15:00.

  2. 12-timers format: Timer varierer fra 1 til 12, med AM (ante meridiem) for tider fra midnatt til middag, og PM (post meridiem) for tider fra middag til midnatt. For eksempel, 15:00 i 24-timers format representeres som 3:00 PM.

Valget mellom disse formatene er stort sett et spørsmål om regional konvensjon og personlig preferanse:

  • 24-timers format brukes vanligvis i de fleste av Europa, Latin-Amerika og Asia, samt i vitenskapelige, militære og medisinske sammenhenger over hele verden.
  • 12-timers format er utbredt i USA, Canada, Australia og noen andre engelsktalende land for daglig bruk.

Grenseverdier og Begrensninger

Når man arbeider med Unix tidsstempler, er det viktig å være oppmerksom på flere grenseverdier og begrensninger:

  1. Negative tidsstempler: Disse representerer datoer før Unix Epoch (1. januar 1970). Selv om de er matematiske gyldige, kan noen systemer håndtere negative tidsstempler feilaktig.

  2. År 2038 Problemet: Unix tidsstempler lagres ofte som 32-bits signerte heltall, som vil overflyte 19. januar 2038. Etter dette punktet vil 32-bits systemer ikke kunne representere tid riktig med mindre de modifiseres for å bruke en større heltallstype.

  3. Ekstremt store tidsstempler: Svært fjerne fremtidige datoer kan ikke være representerbare i noen systemer, eller kan håndteres inkonsekvent.

  4. Skuddsekunder: Unix tid tar ikke hensyn til skuddsekunder, som noen ganger legges til UTC for å kompensere for Jordens uregelmessige rotasjon. Dette betyr at Unix tid ikke er presist synkronisert med astronomisk tid.

  5. Tidssonehensyn: Unix tidsstempler representerer øyeblikk i UTC. Konvertering til lokal tid krever ytterligere tidssoneinformasjon.

  6. Sommertid: Når man konverterer tidsstempler til lokal tid, må kompleksiteten ved overganger til sommertid vurderes.

Bruksområder

Unix tidsstempler brukes i mange applikasjoner innen databehandling og databehandling:

  1. Databaseposter: Tidsstempler brukes ofte til å registrere når oppføringer ble opprettet eller endret.

  2. Webutvikling: HTTP-hoder, informasjonskapsler og hurtigbuffer-mekanismer bruker ofte Unix tidsstempler.

  3. Loggfiler: Systemlogger registrerer vanligvis hendelser med Unix tidsstempler for presis kronologisk rekkefølge.

  4. Versjonskontrollsystemer: Git og andre VCS bruker tidsstempler for å registrere når forpliktelser ble gjort.

  5. API-responser: Mange web-API-er inkluderer tidsstempler i sine svar for å indikere når data ble generert eller når ressurser sist ble endret.

  6. Filsystemer: Filopprettings- og endringstider lagres ofte som Unix tidsstempler.

  7. Sesjonsadministrasjon: Webapplikasjoner bruker tidsstempler for å bestemme når brukersesjoner skal utløpe.

  8. Dataanalyse: Tidsstempler gir en standardisert måte å arbeide med tidsdata i analyseapplikasjoner.

Alternativer

Selv om Unix tidsstempler er mye brukt, finnes det alternative tidsrepresentasjonsformater som kan være mer passende i visse sammenhenger:

  1. ISO 8601: Et standardisert strengformat (f.eks. "2021-01-01T00:00:00Z") som er menneskelig lesbart samtidig som det opprettholder sortering. Det er ofte foretrukket for datautveksling og brukerrettede applikasjoner.

  2. RFC 3339: En profil av ISO 8601 brukt i internettprotokoller, med strengere formateringskrav.

  3. Menneskelig lesbare formater: Lokaliserte datostrenger (f.eks. "1. januar 2021") er mer passende for direkte brukerinteraksjon, men er mindre egnet for beregning.

  4. Microsoft FILETIME: En 64-bits verdi som representerer antall 100-nanosekundintervaller siden 1. januar 1601, brukt i Windows-systemer.

  5. Julian Day Number: Brukt i astronomi og noen vitenskapelige applikasjoner, teller dager siden 1. januar 4713 f.Kr.

Valget av tidsformat avhenger av faktorer som:

  • Nødvendig presisjon
  • Behov for menneskelig lesbarhet
  • Lagringsbegrensninger
  • Kompatibilitet med eksisterende systemer
  • Omfanget av datoer som må representeres

Historie

Konseptet med Unix tid oppstod med utviklingen av Unix-operativsystemet ved Bell Labs på slutten av 1960-tallet og tidlig på 1970-tallet. Beslutningen om å bruke 1. januar 1970 som epoke var noe vilkårlig, men praktisk for tiden – det var nylig nok til å minimere lagringsbehovene for datoer av interesse, men langt nok tilbake for å være nyttig for historiske data.

Den opprinnelige implementeringen brukte et 32-bits signert heltall for å lagre antall sekunder, noe som var tilstrekkelig for den forventede levetiden til Unix-systemer på den tiden. Imidlertid førte denne beslutningen til År 2038 Problemet (noen ganger kalt "Y2K38" eller "Unix Millennium Bug"), ettersom 32-bits signerte heltall bare kan representere datoer opp til 19. januar 2038 (03:14:07 UTC).

Etter hvert som Unix og Unix-liknende operativsystemer fikk popularitet, ble Unix tidsstempel en de facto standard for å representere tid i databehandling. Det ble vedtatt av mange programmeringsspråk, databaser og applikasjoner, og utvidet langt utover sitt opprinnelige Unix-miljø.

Moderne systemer bruker i økende grad 64-bits heltall for tidsstempler, noe som utvider den representerbare rekkevidden til omtrent 292 milliarder år i begge retninger fra epoken, noe som effektivt løser År 2038 Problemet. Imidlertid kan eldre systemer og applikasjoner fortsatt være sårbare.

Unix tidsstempelens enkelhet og nytte har sikret dens fortsatte relevans til tross for utviklingen av mer sofistikerte tidsrepresentasjonsformater. Det forblir et grunnleggende konsept innen databehandling, som ligger til grunn for mye av vår digitale infrastruktur.

Kodeeksempler

Her er eksempler på hvordan man kan konvertere Unix tidsstempler til menneskelig lesbare datoer i ulike programmeringsspråk:

// JavaScript tidsstempel konvertering
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Opprett et nytt Date-objekt (JavaScript bruker millisekunder)
  const date = new Date(timestamp * 1000);
  
  // Formatalternativer
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Konverter til streng ved hjelp av lokal formatering
  return date.toLocaleString(undefined, options);
}

// Eksempel på bruk
const timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24-timers format
console.log(convertUnixTimestamp(timestamp, true));  // 12-timers format
# Python tidsstempel konvertering
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Konverter Unix tidsstempel til datetime-objekt
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Format dato-strengen
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12-timers format med AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24-timers format
    
    return date.strftime(format_string)

# Eksempel på bruk
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24-timers format
print(convert_unix_timestamp(timestamp, True))   # 12-timers format
<?php
// PHP tidsstempel konvertering
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Formatstreng
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12-timers format med AM/PM
        : 'l, F j, Y H:i:s';   // 24-timers format
    
    // Konverter og formater datoen
    return date($formatString, $timestamp);
}

// Eksempel på bruk
$timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24-timers format
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12-timers format
?>
// Java tidsstempel konvertering
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) {
        // Konverter Unix tidsstempel til Instant, deretter til LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Opprett formatter basert på ønsket format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formater datoen
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24-timers format
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12-timers format
    }
}
// C# tidsstempel konvertering
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Konverter Unix tidsstempel til DateTime
        // Unix tidsstempel er sekunder siden 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Formatstreng basert på 12-timers eller 24-timers preferanse
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12-timers format med AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24-timers format
        
        // Returner formatert dato-streng
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24-timers format
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12-timers format
    }
}
# Ruby tidsstempel konvertering
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Konverter Unix tidsstempel til Time-objekt
  time = Time.at(timestamp)
  
  # Format basert på 12-timers eller 24-timers preferanse
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12-timers format med AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24-timers format
  end
end

# Eksempel på bruk
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24-timers format
puts convert_unix_timestamp(timestamp, true)   # 12-timers format
// Go tidsstempel konvertering
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Konverter Unix tidsstempel til Time
    t := time.Unix(timestamp, 0)
    
    // Formatstreng basert på 12-timers eller 24-timers preferanse
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12-timers format med AM/PM
    } else {
        formatString += "15:04:05"    // 24-timers format
    }
    
    // Returner formatert tid
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. januar 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24-timers format
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12-timers format
}
// Swift tidsstempel konvertering
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Opprett Date fra Unix tidsstempel
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Opprett DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Sett tidsstil basert på 12-timers eller 24-timers preferanse
    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")
    }
    
    // Returner formatert dato
    return formatter.string(from: date)
}

// Eksempel på bruk
let timestamp = 1609459200 // 1. januar 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24-timers format
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12-timers format
# R tidsstempel konvertering
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Konverter Unix tidsstempel til POSIXct datetime
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Format basert på 12-timers eller 24-timers preferanse
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12-timers format med AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24-timers format
  }
  
  # Returner formatert dato-streng
  format(date_time, format_string)
}

# Eksempel på bruk
timestamp <- 1609459200  # 1. januar 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24-timers format
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12-timers format
% MATLAB tidsstempel konvertering
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Konverter Unix tidsstempel til MATLAB datetime
    % MATLAB datoer er dager siden 1900-01-01, med 1 = 1900-01-01
    % Unix tidsstempel er sekunder siden 1970-01-01
    
    % Først konverter til Excel datoformat
    % 25569 er antall dager mellom 1900-01-01 og 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formatere dato basert på 12-timers eller 24-timers preferanse
    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

% Eksempel på bruk
timestamp = 1609459200;  % 1. januar 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24-timers format
disp(convertUnixTimestamp(timestamp, true))   % 12-timers format
' Excel VBA tidsstempel konvertering
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Konverter Unix tidsstempel til Excel dato/tid
    ' Excel datoer er dager siden 1900-01-01, med 1 = 1900-01-01
    ' Unix tidsstempel er sekunder siden 1970-01-01
    
    ' Først konverter til Excel datoformat
    ' 25569 er antall dager mellom 1900-01-01 og 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formatere dato basert på 12-timers eller 24-timers preferanse
    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

' Bruk i et regneark:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12-timers format
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24-timers format

Håndtering av Grenseverdier

Når man arbeider med Unix tidsstempler, er det viktig å håndtere grenseverdier riktig. Her er eksempler på håndtering av noen vanlige grenseverdier:

// JavaScript grenseverdi håndtering
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Sjekk om tidsstempelet er gyldig
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Ugyldig tidsstempel";
  }
  
  // Sjekk for negative tidsstempler (datoer før 1970)
  if (timestamp < 0) {
    // Noen nettlesere kan håndtere negative tidsstempler feilaktig
    // Bruk en mer robust tilnærming for datoer før 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Ugyldig dato (før 1970)";
    }
  }
  
  // Sjekk for Y2K38-problemet (for 32-bits systemer)
  const maxInt32 = 2147483647; // Maksimal verdi for 32-bits signert heltall
  if (timestamp > maxInt32) {
    // Vurder å bruke BigInt for svært store tidsstempler i moderne JavaScript
    console.warn("Tidsstempelet overskrider 32-bits heltallsgrensen (Y2K38-problem)");
  }
  
  // Fortsett med normal konvertering
  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 "Feil ved konvertering av tidsstempel: " + error.message;
  }
}

Referanser

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

  2. "År 2038 Problemet." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "The Complexities of Calendrical Time." 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: Date and Time on the Internet: Timestamps." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., og Dennis M. Ritchie. "The C Programming Language." Prentice Hall, 1988.

Feedback