Whiz Tools

Prevádzač Unixového časového razítka

Unix tidsstempel er antallet af sekunder siden 1. januar 1970 (UTC)

Prevedený dátum a čas

Konvertor Unix časových pečiatok

Úvod

Unix časová pečiatka (známa aj ako POSIX čas alebo Epoch čas) je systém na opisovanie bodu v čase. Je to počet sekúnd, ktoré uplynuli od 1. januára 1970 (polnoc UTC/GMT), bez zohľadnenia prestupných sekúnd. Unix časové pečiatky sú široko používané v počítačových systémoch a programovacích jazykoch, pretože poskytujú kompaktné, jazykovo nezávislé zastúpenie konkrétneho okamihu v čase.

Tento konvertor vám umožňuje transformovať Unix časovú pečiatku na ľahko čitateľný formát dátumu a času. Podporuje formáty času 12-hodinový (AM/PM) a 24-hodinový, aby vyhovoval rôznym regionálnym a osobným preferenciám.

Ako fungujú Unix časové pečiatky

Unix časové pečiatky sa počítajú ako počet sekúnd od Unix Epoch (1. januára 1970, 00:00:00 UTC). To ich robí obzvlášť užitočnými na výpočet časových rozdielov a na ukladanie dátumov v kompaktnom formáte.

Matematická konverzia z Unix časovej pečiatky na kalendárny dátum zahŕňa niekoľko krokov:

  1. Začnite s Unix Epoch (1. januára 1970, 00:00:00 UTC)
  2. Pridajte počet sekúnd v časovej pečiatke
  3. Zohľadnite prestupné roky, rôznu dĺžku mesiacov a iné kalendárne zložitosti
  4. Ak je to potrebné, aplikujte úpravy časového pásma

Napríklad, Unix časová pečiatka 1609459200 predstavuje piatok, 1. januára 2021, 00:00:00 UTC.

Konverzný vzorec možno vyjadriť ako:

Daˊtum=Unix Epoch+Cˇasovaˊ pecˇiatka (v sekundaˊch)\text{Dátum} = \text{Unix Epoch} + \text{Časová pečiatka (v sekundách)}

Väčšina programovacích jazykov a operačných systémov poskytuje vstavané funkcie na spracovanie tejto konverzie, čím abstrahuje zložitosti kalendára.

Možnosti formátu času

Tento konvertor ponúka dve možnosti formátu času:

  1. 24-hodinový formát (niekedy nazývaný "vojenský čas"): Hodiny sa pohybujú od 0 do 23 a neexistuje žiadne označenie AM/PM. Napríklad, 15:00 je reprezentované ako 15:00.

  2. 12-hodinový formát: Hodiny sa pohybujú od 1 do 12, s AM (ante meridiem) pre časy od polnoci do obeda a PM (post meridiem) pre časy od obeda do polnoci. Napríklad, 15:00 v 24-hodinovom formáte je reprezentované ako 3:00 PM.

Voľba medzi týmito formátmi je do značnej miery otázkou regionálnej konvencie a osobných preferencií:

  • 24-hodinový formát sa bežne používa vo väčšine Európy, Latinskej Ameriky a Ázie, ako aj v vedeckých, vojenských a medicínskych kontextoch po celom svete.
  • 12-hodinový formát je rozšírený v Spojených štátoch, Kanade, Austrálii a niektorých ďalších anglicky hovoriacich krajinách pre každodenné použitie.

Okrajové prípady a obmedzenia

Pri práci s Unix časovými pečiatkami je dôležité byť si vedomý niekoľkých okrajových prípadov a obmedzení:

  1. Negatívne časové pečiatky: Tieto predstavujú dátumy pred Unix Epoch (1. januára 1970). Aj keď sú matematicky platné, niektoré systémy nemusia správne spracovávať negatívne časové pečiatky.

  2. Problém roku 2038: Unix časové pečiatky sa často ukladajú ako 32-bitové celé čísla so znamienkom, ktoré sa pretečú 19. januára 2038. Po tomto bode nebudú 32-bitové systémy schopné správne reprezentovať časy, pokiaľ nebudú upravené na použitie väčšieho typu celého čísla.

  3. Extrémne veľké časové pečiatky: Veľmi vzdialené budúce dátumy nemusia byť v niektorých systémoch reprezentovateľné alebo môžu byť spracovávané nekonzistentne.

  4. Prestupné sekundy: Unix čas nezohľadňuje prestupné sekundy, ktoré sa občas pridávajú do UTC na kompenzáciu nepravidelného rotovania Zeme. To znamená, že Unix čas nie je presne synchronizovaný s astronomickým časom.

  5. Zohľadnenie časových pásiem: Unix časové pečiatky predstavujú okamihy v UTC. Prevod na miestny čas si vyžaduje dodatočné informácie o časovom pásme.

  6. Letný čas: Pri prevode časových pečiatok na miestny čas je potrebné zohľadniť zložitosti prechodu na letný čas.

Použitie

Unix časové pečiatky sa používajú v mnohých aplikáciách naprieč počítačovým a správcovským dátovým prostredím:

  1. Záznamy databáz: Časové pečiatky sa bežne používajú na zaznamenávanie, kedy boli položky vytvorené alebo upravené.

  2. Webový vývoj: HTTP hlavičky, cookies a mechanizmy cache často používajú Unix časové pečiatky.

  3. Logovacie súbory: Systémové logy zvyčajne zaznamenávajú udalosti s Unix časovými pečiatkami pre presné chronologické usporiadanie.

  4. Systémy správy verzií: Git a iné VCS používajú časové pečiatky na zaznamenávanie, kedy boli vykonané commity.

  5. Odpovede API: Mnohé webové API obsahujú časové pečiatky vo svojich odpovediach, aby naznačili, kedy boli údaje vygenerované alebo kedy boli zdroje naposledy upravené.

  6. Súborové systémy: Časy vytvorenia a úpravy súborov sa často ukladajú ako Unix časové pečiatky.

  7. Správa relácií: Webové aplikácie používajú časové pečiatky na určenie, kedy by sa mali relácie používateľov ukončiť.

  8. Analýza dát: Časové pečiatky poskytujú štandardizovaný spôsob práce s časovými údajmi v analytických aplikáciách.

Alternatívy

Aj keď sú Unix časové pečiatky široko používané, existujú alternatívne formáty reprezentácie času, ktoré môžu byť vhodnejšie v určitých kontextoch:

  1. ISO 8601: Štandardizovaný reťazcový formát (napr. "2021-01-01T00:00:00Z"), ktorý je ľahko čitateľný a zároveň zachováva zoraditeľnosť. Často sa preferuje pre výmenu dát a používateľské aplikácie.

  2. RFC 3339: Profil ISO 8601 používaný v internetových protokoloch, s prísnejšími požiadavkami na formátovanie.

  3. Ľahko čitateľné formáty: Lokalizované reťazce dátumov (napr. "1. január 2021") sú vhodnejšie pre priamu interakciu s používateľom, ale sú menej vhodné na výpočty.

  4. Microsoft FILETIME: 64-bitová hodnota predstavujúca počet 100-nanosekúnd od 1. januára 1601, používaná v systémoch Windows.

  5. Julian Day Number: Používa sa v astronómii a niektorých vedeckých aplikáciách, počítajúc dni od 1. januára 4713 pred naším letopočtom.

Voľba formátu času závisí od faktorov, ako sú:

  • Požadovaná presnosť
  • Potreby ľudskej čitateľnosti
  • Obmedzenia ukladania
  • Kompatibilita s existujúcimi systémami
  • Rozsah dátumov, ktoré je potrebné reprezentovať

História

Koncept Unix času vznikol s vývojom operačného systému Unix v Bell Labs na konci 60. a začiatku 70. rokov. Rozhodnutie použiť 1. január 1970 ako epochu bolo do istej miery náhodné, ale praktické pre daný čas—bolo to nedávno, aby sa minimalizovali požiadavky na ukladanie pre zaujímavé dátumy, ale dostatočne ďaleko v minulosti, aby bolo užitočné pre historické dáta.

Pôvodná implementácia používala 32-bitové celé číslo so znamienkom na uloženie počtu sekúnd, čo bolo dostatočné pre očakávanú životnosť Unix systémov v tom čase. Avšak toto rozhodnutie viedlo k problému roku 2038 (niekedy nazývanému "Y2K38" alebo "Unix Millennium Bug"), pretože 32-bitové celé čísla môžu reprezentovať iba dátumy do 19. januára 2038 (03:14:07 UTC).

Keď Unix a Unix-like operačné systémy získali popularitu, Unix časová pečiatka sa stala de facto štandardom pre reprezentáciu času v počítačoch. Bola prijatá mnohými programovacími jazykmi, databázami a aplikáciami, rozširujúc sa ďaleko za svoj pôvodný unixový prostredie.

Moderné systémy čoraz častejšie používajú 64-bitové celé čísla pre časové pečiatky, čo rozširuje reprezentovateľný rozsah na približne 292 miliárd rokov v oboch smeroch od epochy, čím sa efektívne rieši problém roku 2038. Avšak staršie systémy a aplikácie môžu byť stále zraniteľné.

Jednoduchosť a užitočnosť Unix časovej pečiatky zabezpečili jej pokračujúcu relevantnosť aj napriek vývoju sofistikovanejších formátov reprezentácie času. Zostáva základným konceptom v počítačoch, ktorý podporuje väčšinu našej digitálnej infraštruktúry.

Kódové príklady

Tu sú príklady, ako konvertovať Unix časové pečiatky na ľahko čitateľné dátumy v rôznych programovacích jazykoch:

// JavaScript konverzia časovej pečiatky
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Vytvorte nový objekt Date (JavaScript používa milisekundy)
  const date = new Date(timestamp * 1000);
  
  // Možnosti formátovania
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Preveďte na reťazec pomocou formátovania lokality
  return date.toLocaleString(undefined, options);
}

// Príklad použitia
const timestamp = 1609459200; // 1. január 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24-hodinový formát
console.log(convertUnixTimestamp(timestamp, true));  // 12-hodinový formát
# Python konverzia časovej pečiatky
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Preveďte Unix časovú pečiatku na objekt datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formát reťazca
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12-hodinový formát s AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24-hodinový formát
    
    return date.strftime(format_string)

# Príklad použitia
timestamp = 1609459200  # 1. január 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24-hodinový formát
print(convert_unix_timestamp(timestamp, True))   # 12-hodinový formát
<?php
// PHP konverzia časovej pečiatky
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Formát reťazca
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12-hodinový formát s AM/PM
        : 'l, F j, Y H:i:s';   // 24-hodinový formát
    
    // Preveďte a formátujte dátum
    return date($formatString, $timestamp);
}

// Príklad použitia
$timestamp = 1609459200; // 1. január 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24-hodinový formát
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12-hodinový formát
?>
// Java konverzia časovej pečiatky
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) {
        // Preveďte Unix časovú pečiatku na Instant, potom na LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Vytvorte formátovač na základe požadovaného formátu
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            use12Hour ? "EEEE, MMMM d, yyyy h:mm:ss a" : "EEEE, MMMM d, yyyy HH:mm:ss"
        );
        
        // Formátujte dátum
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1. január 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24-hodinový formát
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12-hodinový formát
    }
}
// C# konverzia časovej pečiatky
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Preveďte Unix časovú pečiatku na DateTime
        // Unix časové pečiatky sú sekundy od 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Formát reťazca na základe preferencie 12-hodinového alebo 24-hodinového formátu
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12-hodinový formát s AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24-hodinový formát
        
        // Vráťte formátovaný reťazec dátumu
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. január 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24-hodinový formát
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12-hodinový formát
    }
}
# Ruby konverzia časovej pečiatky
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Preveďte Unix časovú pečiatku na objekt Time
  time = Time.at(timestamp)
  
  # Formát na základe preferencie 12-hodinového alebo 24-hodinového formátu
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12-hodinový formát s AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24-hodinový formát
  end
end

# Príklad použitia
timestamp = 1609459200  # 1. január 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24-hodinový formát
puts convert_unix_timestamp(timestamp, true)   # 12-hodinový formát
// Go konverzia časovej pečiatky
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Preveďte Unix časovú pečiatku na Time
    t := time.Unix(timestamp, 0)
    
    // Formát reťazca na základe preferencie 12-hodinového alebo 24-hodinového formátu
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12-hodinový formát s AM/PM
    } else {
        formatString += "15:04:05"    // 24-hodinový formát
    }
    
    // Vráťte formátovaný čas
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. január 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24-hodinový formát
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12-hodinový formát
}
// Swift konverzia časovej pečiatky
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Vytvorte Date z Unix časovej pečiatky
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Vytvorte DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Nastavte časový štýl na základe preferencie 12-hodinového alebo 24-hodinového formátu
    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")
    }
    
    // Vráťte formátovaný dátum
    return formatter.string(from: date)
}

// Príklad použitia
let timestamp = 1609459200 // 1. január 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24-hodinový formát
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12-hodinový formát
# R konverzia časovej pečiatky
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Preveďte Unix časovú pečiatku na POSIXct datetime
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formát na základe preferencie 12-hodinového alebo 24-hodinového formátu
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12-hodinový formát s AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24-hodinový formát
  }
  
  # Vráťte formátovaný reťazec dátumu
  format(date_time, format_string)
}

# Príklad použitia
timestamp <- 1609459200  # 1. január 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24-hodinový formát
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12-hodinový formát
% MATLAB konverzia časovej pečiatky
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Preveďte Unix časovú pečiatku na MATLAB datetime
    % MATLAB dátumy sú dni od 1900-01-01, s 1 = 1900-01-01
    % Unix časové pečiatky sú sekundy od 1970-01-01
    
    % Najprv prevedieme na Excel dátový formát
    % 25569 je počet dní medzi 1900-01-01 a 1970-01-01
    excelDate = (timestamp / 86400) + 25569;
    
    % Formát na základe preferencie 12-hodinového alebo 24-hodinového formátu
    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

% Príklad použitia
timestamp = 1609459200;  % 1. január 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24-hodinový formát
disp(convertUnixTimestamp(timestamp, true))   % 12-hodinový formát
' Excel VBA konverzia časovej pečiatky
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Preveďte Unix časovú pečiatku na Excel dátum/čas
    ' Excel dátumy sú dni od 1900-01-01, s 1 = 1900-01-01
    ' Unix časové pečiatky sú sekundy od 1970-01-01
    
    ' Najprv prevedieme na Excel dátový formát
    ' 25569 je počet dní medzi 1900-01-01 a 1970-01-01
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formát reťazca na základe preferencie 12-hodinového alebo 24-hodinového formátu
    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

' Použitie v hárku:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12-hodinový formát
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24-hodinový formát

Riešenie okrajových prípadov

Pri práci s Unix časovými pečiatkami je dôležité správne riešiť okrajové prípady. Tu sú príklady riešenia niektorých bežných okrajových prípadov:

// JavaScript riešenie okrajových prípadov
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Skontrolujte, či je časová pečiatka platná
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Neplatná časová pečiatka";
  }
  
  // Skontrolujte negatívne časové pečiatky (dátumy pred 1970)
  if (timestamp < 0) {
    // Niektoré prehliadače nemusia správne spracovávať negatívne časové pečiatky
    // Použite robustnejší prístup pre dátumy pred 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Neplatný dátum (pred 1970)";
    }
  }
  
  // Skontrolujte problém Y2K38 (pre 32-bitové systémy)
  const maxInt32 = 2147483647; // Maximálna hodnota pre 32-bitové celé číslo
  if (timestamp > maxInt32) {
    // Zvážte použitie BigInt pre veľmi veľké časové pečiatky v modernej JavaScripte
    console.warn("Časová pečiatka presahuje limit 32-bitového celého čísla (problém Y2K38)");
  }
  
  // Pokračujte s normálnou konverziou
  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 "Chyba pri konverzii časovej pečiatky: " + error.message;
  }
}

Odkazy

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

  2. "Problém roku 2038." Wikipedia, Wikimedia Foundation, https://en.wikipedia.org/wiki/Year_2038_problem

  3. Olson, Arthur David. "Zložitosti kalendárneho času." 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: Dátum a čas na internete: Časové pečiatky." Internet Engineering Task Force (IETF), https://tools.ietf.org/html/rfc3339

  6. Kernighan, Brian W., a Dennis M. Ritchie. "Programovací jazyk C." Prentice Hall, 1988.

Feedback