Whiz Tools

Pretvornik Unix časovnega žiga

Der Unix-Zeitstempel ist die Anzahl der Sekunden seit dem 1. Januar 1970 (UTC)

Pretvorjen datum in čas

Pretvornik Unix časovnega žiga

Uvod

Unix časovni žig (znan tudi kot POSIX čas ali Epoch čas) je sistem za opisovanje točke v času. To je število sekund, ki so minile od 1. januarja 1970 (polnoč UTC/GMT), brez upoštevanja prestopnih sekund. Unix časovni žigi se široko uporabljajo v računalniških sistemih in programskih jezikih, saj zagotavljajo kompaktno, jezikovno neodvisno predstavitev določenega trenutka v času.

Ta pretvornik vam omogoča, da spremenite Unix časovni žig v človeško berljivo obliko datuma in časa. Podpira tako 12-urni (AM/PM) kot 24-urni časovni format, da ustreza različnim regionalnim in osebnim preferencam.

Kako delujejo Unix časovni žigi

Unix časovni žigi se izračunajo kot število sekund od Unix Epoch (1. januar 1970, 00:00:00 UTC). To jih dela še posebej uporabne za izračun časovnih razlik in za shranjevanje datumov v kompaktni obliki.

Matematična pretvorba iz Unix časovnega žiga v koledarski datum vključuje več korakov:

  1. Začnite z Unix Epoch (1. januar 1970, 00:00:00 UTC)
  2. Dodajte število sekund v časovnem žigu
  3. Upoštevajte prestopne leta, različne dolžine mesecev in druge koledarske zapletenosti
  4. Uporabite prilagoditve časovnega pasu, če je potrebno

Na primer, Unix časovni žig 1609459200 predstavlja petek, 1. januar 2021, 00:00:00 UTC.

Pretvorbena formula se lahko izrazi kot:

Datum=Unix Epoch+Cˇasovni zˇig (v sekundah)\text{Datum} = \text{Unix Epoch} + \text{Časovni žig (v sekundah)}

Večina programskih jezikov in operacijskih sistemov ponuja vgrajene funkcije za obravnavo te pretvorbe, ki abstraktno obravnavajo kompleksne koledarske izračune.

Možnosti časovnega formata

Ta pretvornik ponuja dve možnosti časovnega formata:

  1. 24-urni format (včasih imenovan "vojaški čas"): Ure se gibljejo od 0 do 23, brez označbe AM/PM. Na primer, 15:00 je predstavljeno kot 15:00.

  2. 12-urni format: Ure se gibljejo od 1 do 12, z AM (ante meridiem) za čase od polnoči do poldneva, in PM (post meridiem) za čase od poldneva do polnoči. Na primer, 15:00 v 24-urnem formatu je predstavljeno kot 3:00 PM.

Izbira med tema formatoma je večinoma stvar regionalne konvencije in osebne preference:

  • 24-urni format se pogosto uporablja v večini Evrope, Latinski Ameriki in Aziji, pa tudi v znanstvenih, vojaških in medicinskih kontekstih po vsem svetu.
  • 12-urni format je razširjen v Združenih državah, Kanadi, Avstraliji in nekaterih drugih angleško govorečih državah za vsakodnevno uporabo.

Robne primere in omejitve

Pri delu z Unix časovnimi žigi je pomembno biti pozoren na več robnih primerov in omejitev:

  1. Negativni časovni žigi: Ti predstavljajo datume pred Unix Epoch (1. januar 1970). Čeprav so matematično veljavni, nekateri sistemi morda ne obravnavajo negativnih časovnih žigov pravilno.

  2. Problem leta 2038: Unix časovni žigi se pogosto shranjujejo kot 32-bitni celoštevilski podatki, kar bo povzročilo prelivanje 19. januarja 2038. Po tem datumu sistemi, ki uporabljajo 32-bitne podatke, ne bodo mogli pravilno predstavljati časov, razen če jih spremenijo, da uporabijo večjo celoštevilsko vrsto.

  3. Zelo veliki časovni žigi: Zelo oddaljeni datumi morda ne bodo predstavljivi v nekaterih sistemih ali pa bodo obravnavani nekonsistentno.

  4. Prestopne sekunde: Unix čas ne upošteva prestopnih sekund, ki se občasno dodajajo UTC, da bi nadomestile nepravilnosti v vrtenju Zemlje. To pomeni, da Unix čas ni natančno usklajen z astronomskim časom.

  5. Upoštevanje časovnih pasov: Unix časovni žigi predstavljajo trenutke v UTC. Pretvorba v lokalni čas zahteva dodatne informacije o časovnem pasu.

  6. Poletni čas: Pri pretvorbi časovnih žigov v lokalni čas je treba upoštevati kompleksnosti prehodov na poletni čas.

Uporabni primeri

Unix časovni žigi se uporabljajo v številnih aplikacijah v računalništvu in upravljanju podatkov:

  1. Zapisniki podatkov: Časovni žigi se pogosto uporabljajo za beleženje, kdaj so bile vnose ustvarjene ali spremenjene.

  2. Razvoj spletnih strani: HTTP glave, piškotki in mehanizmi predpomnjenja pogosto uporabljajo Unix časovne žige.

  3. Dnevniški datoteke: Sistemski dnevniki običajno beležijo dogodke s časovnimi žigi Unix za natančno kronološko razvrščanje.

  4. Sistemi za nadzor različic: Git in drugi VCS uporabljajo časovne žige za beleženje, kdaj so bile narejene zaveze.

  5. Odgovori API-jev: Mnogi spletni API-ji vključujejo časovne žige v svojih odgovorih, da označijo, kdaj so bili podatki ustvarjeni ali kdaj so bile vire nazadnje spremenjene.

  6. Datotečni sistemi: Časi ustvarjanja in sprememb datotek se pogosto shranjujejo kot Unix časovni žigi.

  7. Upravljanje sej: Spletne aplikacije uporabljajo časovne žige za določitev, kdaj naj se uporabniške seje iztečejo.

  8. Analiza podatkov: Časovni žigi zagotavljajo standardiziran način dela s časovnimi podatki v analitičnih aplikacijah.

Alternativen

Medtem ko so Unix časovni žigi široko uporabljeni, obstajajo alternativni formati predstavitve časa, ki so morda bolj primerni v določenih kontekstih:

  1. ISO 8601: Standardizirana nizovna oblika (npr. "2021-01-01T00:00:00Z"), ki je človeško berljiva, hkrati pa ohranja možnost razvrščanja. Pogosto je prednostna za izmenjavo podatkov in uporabniške aplikacije.

  2. RFC 3339: Profil ISO 8601, ki se uporablja v internetnih protokolih, z strožjimi zahtevami glede oblikovanja.

  3. Človeško berljive oblike: Lokalizirani nizovi datumov (npr. "1. januar 2021") so bolj primerni za neposredno interakcijo z uporabniki, vendar so manj primerni za izračun.

  4. Microsoft FILETIME: 64-bitna vrednost, ki predstavlja število 100-nanosekundnih intervalov od 1. januarja 1601, ki se uporablja v sistemih Windows.

  5. Julijanski dan: Uporablja se v astronomiji in nekaterih znanstvenih aplikacijah, šteje dni od 1. januarja 4713 pr. n. št.

Izbira formata časa je odvisna od dejavnikov, kot so:

  • Zahtevana natančnost
  • Potrebe po človeški berljivosti
  • Omejitve shranjevanja
  • Združljivost z obstoječimi sistemi
  • Obseg datumov, ki jih je treba predstaviti

Zgodovina

Koncept Unix časa se je pojavil z razvojem operacijskega sistema Unix v Bell Labs v poznih 1960-ih in zgodnjih 1970-ih. Odločitev za uporabo 1. januarja 1970 kot epohe je bila nekoliko naključna, vendar praktična za takrat - bila je dovolj nedavna, da bi zmanjšala potrebe po shranjevanju datumov, ki so bili zanimivi, vendar dovolj oddaljena v preteklosti, da bi bila uporabna za zgodovinske podatke.

Prvotna implementacija je uporabila 32-bitno celoštevilsko število za shranjevanje števila sekund, kar je bilo zadostno za pričakovano življenjsko dobo Unix sistemov tistega časa. Vendar je ta odločitev privedla do problema leta 2038 (včasih imenovanega "Y2K38" ali "Unix Millennium Bug"), saj 32-bitni celoštevilski podatki lahko predstavljajo le datume do 19. januarja 2038 (03:14:07 UTC).

Ko so Unix in Unix-podobni operacijski sistemi pridobili priljubljenost, je Unix časovni žig postal de facto standard za predstavitev časa v računalništvu. Sprejeli so ga številni programski jeziki, podatkovne baze in aplikacije, ki so se razširili daleč onkraj svojega prvotnega Unix okolja.

Sodobni sistemi vse bolj uporabljajo 64-bitne cele številke za časovne žige, kar podaljša predstavljivi obseg na približno 292 milijard let v obeh smereh od epohe, kar učinkovito rešuje problem leta 2038. Vendar so lahko dediščinski sistemi in aplikacije še vedno ranljive.

Enostavnost in uporabnost Unix časovnega žiga sta zagotovila njegovo nadaljnjo relevantnost kljub razvoju bolj sofisticiranih formatov predstavitve časa. Ostaja temeljni koncept v računalništvu, ki podpira veliko naše digitalne infrastrukture.

Kode Primeri

Tukaj so primeri, kako pretvoriti Unix časovne žige v človeško berljive datume v različnih programskih jezikih:

// JavaScript pretvorba časovnega žiga
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Ustvari nov objekt Date (JavaScript uporablja milisekunde)
  const date = new Date(timestamp * 1000);
  
  // Možnosti oblikovanja
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Pretvori v niz z uporabo lokalnega oblikovanja
  return date.toLocaleString(undefined, options);
}

// Primer uporabe
const timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24-urni format
console.log(convertUnixTimestamp(timestamp, true));  // 12-urni format
# Python pretvorba časovnega žiga
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Pretvori Unix časovni žig v objekt datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Oblikovanje niza datuma
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12-urni format z AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24-urni format
    
    return date.strftime(format_string)

# Primer uporabe
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24-urni format
print(convert_unix_timestamp(timestamp, True))   # 12-urni format
<?php
// PHP pretvorba časovnega žiga
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Oblikovanje niza
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12-urni format z AM/PM
        : 'l, F j, Y H:i:s';   // 24-urni format
    
    // Pretvori in oblikuj datum
    return date($formatString, $timestamp);
}

// Primer uporabe
$timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24-urni format
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12-urni format
?>
// Java pretvorba časovnega žiga
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) {
        // Pretvori Unix časovni žig v Instant, nato v LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Ustvari oblikovalec na podlagi želenega formata
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Oblikuj datum
        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-urni format
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12-urni format
    }
}
// C# pretvorba časovnega žiga
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Pretvori Unix časovni žig v DateTime
        // Unix časovni žig je sekunde od 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Oblikovanje niza na podlagi 12-urnega ali 24-urnega preferenc
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12-urni format z AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24-urni format
        
        // Vrni oblikovan niz datuma
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. januar 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24-urni format
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12-urni format
    }
}
# Ruby pretvorba časovnega žiga
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Pretvori Unix časovni žig v objekt Time
  time = Time.at(timestamp)
  
  # Oblikovanje na podlagi 12-urnega ali 24-urnega preferenc
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12-urni format z AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24-urni format
  end
end

# Primer uporabe
timestamp = 1609459200  # 1. januar 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24-urni format
puts convert_unix_timestamp(timestamp, true)   # 12-urni format
// Go pretvorba časovnega žiga
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Pretvori Unix časovni žig v Time
    t := time.Unix(timestamp, 0)
    
    // Oblikovanje niza na podlagi 12-urnega ali 24-urnega preferenc
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12-urni format z AM/PM
    } else {
        formatString += "15:04:05"    // 24-urni format
    }
    
    // Vrni oblikovan čas
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. januar 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24-urni format
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12-urni format
}
// Swift pretvorba časovnega žiga
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Ustvari Date iz Unix časovnega žiga
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Ustvari DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Nastavi časovni slog na podlagi 12-urnega ali 24-urnega preferenc
    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")
    }
    
    // Vrni oblikovan datum
    return formatter.string(from: date)
}

// Primer uporabe
let timestamp = 1609459200 // 1. januar 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24-urni format
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12-urni format
# R pretvorba časovnega žiga
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Pretvori Unix časovni žig v POSIXct datetime
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Oblikovanje na podlagi 12-urnega ali 24-urnega preferenc
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12-urni format z AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24-urni format
  }
  
  # Vrni oblikovan niz datuma
  format(date_time, format_string)
}

# Primer uporabe
timestamp <- 1609459200  # 1. januar 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24-urni format
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12-urni format
% MATLAB pretvorba časovnega žiga
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Pretvori Unix časovni žig v MATLAB datetime
    % MATLAB datumi so dnevi od 1900-01-01, pri čemer je 1 = 1900-01-01
    % Unix časovni žigi so sekunde od 1970-01-01
    
    % Najprej pretvori v Excel datumni format
    % 25569 je število dni med 1900-01-01 in 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Oblikovanje na podlagi 12-urnega ali 24-urnega preferenc
    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

% Primer uporabe
timestamp = 1609459200;  % 1. januar 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24-urni format
disp(convertUnixTimestamp(timestamp, true))   % 12-urni format
' Excel VBA pretvorba časovnega žiga
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Pretvori Unix časovni žig v Excel datum/čas
    ' Excel datumi so dnevi od 1900-01-01, pri čemer je 1 = 1900-01-01
    ' Unix časovni žigi so sekunde od 1970-01-01
    
    ' Najprej pretvori v Excel datumni format
    ' 25569 je število dni med 1900-01-01 in 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Oblikovanje niza na podlagi 12-urnega ali 24-urnega preferenc
    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

' Uporaba v delovnem listu:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12-urni format
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24-urni format

Obvladovanje robnih primerov

Pri delu z Unix časovnimi žigi je pomembno pravilno obravnavati robne primere. Tukaj so primeri obravnave nekaterih pogostih robnih primerov:

// JavaScript obravnava robnih primerov
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Preveri, ali je časovni žig veljaven
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Neveljaven časovni žig";
  }
  
  // Preveri za negativne časovne žige (datumi pred 1970)
  if (timestamp < 0) {
    // Nekateri brskalniki morda ne obravnavajo negativnih časovnih žigov pravilno
    // Uporabi bolj robusten pristop za datume pred 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Neveljavna datum (pred 1970)";
    }
  }
  
  // Preveri za problem Y2K38 (za 32-bitne sisteme)
  const maxInt32 = 2147483647; // Največja vrednost za 32-bitni celoštevilski podatek
  if (timestamp > maxInt32) {
    // Razmislite o uporabi BigInt za zelo velike časovne žige v modernem JavaScriptu
    console.warn("Časovni žig presega omejitev 32-bitnega celega števila (problem Y2K38)");
  }
  
  // Nadaljuj s normalno pretvorbo
  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 "Napaka pri pretvorbi časovnega žiga: " + error.message;
  }
}

Reference

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

  2. "Problem leta 2038." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Zapletenosti koledarskega časa." 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: Datum in čas na internetu: Časovni žigi." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., in Dennis M. Ritchie. "C programski jezik." Prentice Hall, 1988.

Feedback