Whiz Tools

Převodník Unixového časového razítka

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

Převedený datum a čas

Převod Unixového Časového Razítka

Úvod

Unixové časové razítko (také známé jako POSIX čas nebo Epoch čas) je systém pro popis okamžiku v čase. Je to počet sekund, které uplynuly od 1. ledna 1970 (půlnoc UTC/GMT), bez započítání přestupných sekund. Unixová časová razítka jsou široce používána v počítačových systémech a programovacích jazycích, protože poskytují kompaktní, jazykově nezávislé zastoupení konkrétního okamžiku v čase.

Tento převodník vám umožňuje převést Unixové časové razítko na datum a čas ve formátu, který je snadno čitelný pro lidi. Podporuje jak 12hodinový (AM/PM), tak 24hodinový časový formát, aby vyhovoval různým regionálním a osobním preferencím.

Jak fungují Unixová časová razítka

Unixová časová razítka se počítají jako počet sekund od Unixové Epochy (1. ledna 1970, 00:00:00 UTC). To je činí obzvlášť užitečnými pro výpočty časových rozdílů a pro ukládání dat v kompaktním formátu.

Matematický převod z Unixového časového razítka na kalendářní datum zahrnuje několik kroků:

  1. Začněte s Unixovou Epochou (1. ledna 1970, 00:00:00 UTC)
  2. Přidejte počet sekund v časovém razítku
  3. Zohledněte přestupné roky, různé délky měsíců a další složitosti kalendáře
  4. Aplikujte úpravy časového pásma, pokud je to potřeba

Například Unixové časové razítko 1609459200 představuje pátek, 1. ledna 2021, 00:00:00 UTC.

Převodní vzorec lze vyjádřit jako:

Datum=Unixovaˊ Epoch+Cˇasoveˊ razıˊtko (v sekundaˊch)\text{Datum} = \text{Unixová Epoch} + \text{Časové razítko (v sekundách)}

Většina programovacích jazyků a operačních systémů poskytuje vestavěné funkce pro zpracování tohoto převodu, což abstrahuje složité kalendářní výpočty.

Možnosti formátu času

Tento převodník nabízí dvě možnosti formátu času:

  1. 24hodinový formát (někdy nazývaný "vojenský čas"): Hodiny se pohybují od 0 do 23 a neexistuje žádná označení AM/PM. Například 15:00 je reprezentováno jako 15:00.

  2. 12hodinový formát: Hodiny se pohybují od 1 do 12, s AM (ante meridiem) pro časy od půlnoci do poledne a PM (post meridiem) pro časy od poledne do půlnoci. Například 15:00 ve 24hodinovém formátu je reprezentováno jako 3:00 PM.

Volba mezi těmito formáty je většinou otázkou regionální konvence a osobních preferencí:

  • 24hodinový formát se běžně používá ve většině Evropy, Latinské Ameriky a Asie, stejně jako v vědeckých, vojenských a lékařských kontextech po celém světě.
  • 12hodinový formát je rozšířený v USA, Kanadě, Austrálii a některých dalších anglicky mluvících zemích pro každodenní použití.

Hraniční případy a omezení

Při práci s Unixovými časovými razítky je důležité být si vědom několika hraničních případů a omezení:

  1. Negativní časová razítka: Tato představují data před Unixovou Epochou (1. ledna 1970). Ačkoli jsou matematicky platná, některé systémy nemusí správně zpracovávat negativní časová razítka.

  2. Problém roku 2038: Unixová časová razítka jsou často ukládána jako 32bitová podepsaná celá čísla, která přetečou 19. ledna 2038. Po tomto datu nebudou 32bitové systémy schopny správně reprezentovat časy, pokud nebudou upraveny tak, aby používaly větší typ celého čísla.

  3. Extrémně velká časová razítka: Velmi vzdálené budoucí daty nemusí být reprezentovatelná v některých systémech nebo mohou být zpracovávána nekonzistentně.

  4. Přestupné sekundy: Unixový čas nezohledňuje přestupné sekundy, které jsou občas přidávány do UTC, aby kompenzovaly nepravidelnou rotaci Země. To znamená, že Unixový čas není přesně synchronizován s astronomickým časem.

  5. Zohlednění časového pásma: Unixová časová razítka představují okamžiky v UTC. Převod na místní čas vyžaduje další informace o časovém pásmu.

  6. Letní čas: Při převodu časových razítek na místní čas je třeba zohlednit složitosti přechodů na letní čas.

Případy použití

Unixová časová razítka se používají v mnoha aplikacích v oblasti výpočetní techniky a správy dat:

  1. Záznamy databáze: Časová razítka se běžně používají k zaznamenání, kdy byly položky vytvořeny nebo upraveny.

  2. Webový vývoj: HTTP hlavičky, cookies a mechanismy ukládání do mezipaměti často používají Unixová časová razítka.

  3. Logovací soubory: Systémové logy obvykle zaznamenávají události s Unixovými časovými razítky pro přesné chronologické pořadí.

  4. Systémy správy verzí: Git a další VCS používají časová razítka k zaznamenání, kdy byly provedeny commity.

  5. Odpovědi API: Mnoho webových API zahrnuje časová razítka ve svých odpovědích, aby naznačila, kdy byla data vygenerována nebo kdy byly zdroje naposledy upraveny.

  6. Souborové systémy: Časy vytvoření a úpravy souborů jsou často ukládány jako Unixová časová razítka.

  7. Správa relací: Webové aplikace používají časová razítka k určení, kdy by měly vypršet uživatelské relace.

  8. Analýza dat: Časová razítka poskytují standardizovaný způsob práce s časovými daty v analytických aplikacích.

Alternativy

Ačkoli jsou Unixová časová razítka široce používána, existují alternativní formáty reprezentace času, které mohou být v určitých kontextech vhodnější:

  1. ISO 8601: Standardizovaný řetězcový formát (např. "2021-01-01T00:00:00Z"), který je čitelný pro lidi a zároveň udržuje třídění. Často se preferuje pro výměnu dat a uživatelské aplikace.

  2. RFC 3339: Profil ISO 8601 používaný v internetových protokolech, s přísnějšími požadavky na formátování.

  3. Čitelné formáty pro lidi: Lokalizované datové řetězce (např. "1. ledna 2021") jsou vhodnější pro přímou interakci s uživateli, ale jsou méně vhodné pro výpočty.

  4. Microsoft FILETIME: 64bitová hodnota představující počet intervalů 100 nanosekund od 1. ledna 1601, používaná v systémech Windows.

  5. Julian Day Number: Používá se v astronomii a některých vědeckých aplikacích, počítající dny od 1. ledna 4713 př. n. l.

Volba formátu času závisí na faktorech, jako jsou:

  • Požadovaná přesnost
  • Potřeby čitelnosti pro lidi
  • Omezující faktory pro ukládání
  • Kompatibilita se stávajícími systémy
  • Rozsah dat, která je třeba reprezentovat

Historie

Koncept Unixového času vznikl s vývojem operačního systému Unix v Bell Labs na konci 60. a začátku 70. let. Rozhodnutí použít 1. ledna 1970 jako epochu bylo poněkud arbitrární, ale praktické pro tu dobu – bylo to dost nedávné, aby se minimalizovaly požadavky na ukládání pro data, která byla zajímavá, ale dost daleko v minulosti, aby byla užitečná pro historická data.

Původní implementace používala 32bitové podepsané celé číslo pro ukládání počtu sekund, což bylo dostatečné pro očekávanou životnost Unixových systémů v té době. Toto rozhodnutí však vedlo k Problému roku 2038 (někdy nazývanému "Y2K38" nebo "Unix Millennium Bug"), protože 32bitová podepsaná celá čísla mohou reprezentovat pouze data do 19. ledna 2038 (03:14:07 UTC).

Jak Unix a Unix-like operační systémy získaly popularitu, Unixové časové razítko se stalo de facto standardem pro reprezentaci času v počítačích. Bylo přijato mnoha programovacími jazyky, databázemi a aplikacemi, což rozšířilo jeho použití daleko za původní prostředí Unix.

Moderní systémy stále častěji používají 64bitová celá čísla pro časová razítka, což prodlužuje reprezentovatelný rozsah na přibližně 292 miliard let v obou směrech od epochy, což efektivně řeší Problém roku 2038. Nicméně, starší systémy a aplikace mohou být stále zranitelné.

Jednoduchost a užitečnost Unixového časového razítka zajistily jeho pokračující relevanci navzdory vývoji sofistikovanějších formátů reprezentace času. Zůstává základním konceptem v oblasti výpočetní techniky, který tvoří základní kámen naší digitální infrastruktury.

Příklady kódu

Zde jsou příklady, jak převést Unixová časová razítka na snadno čitelná data v různých programovacích jazycích:

// JavaScript převod časového razítka
function convertUnixTimestamp(timestamp, use12Hour = false) {
  // Vytvořte nový objekt Date (JavaScript používá milisekundy)
  const date = new Date(timestamp * 1000);
  
  // Možnosti formátování
  const options = {
    year: 'numeric',
    month: 'long',
    day: 'numeric',
    weekday: 'long',
    hour: use12Hour ? 'numeric' : '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: use12Hour
  };
  
  // Převést na řetězec pomocí formátování podle lokality
  return date.toLocaleString(undefined, options);
}

// Příklad použití
const timestamp = 1609459200; // 1. ledna 2021 00:00:00 UTC
console.log(convertUnixTimestamp(timestamp, false)); // 24hodinový formát
console.log(convertUnixTimestamp(timestamp, true));  // 12hodinový formát
# Python převod časového razítka
import datetime

def convert_unix_timestamp(timestamp, use_12hour=False):
    # Převést Unixové časové razítko na objekt datetime
    date = datetime.datetime.fromtimestamp(timestamp)
    
    # Formát řetězce
    if use_12hour:
        format_string = "%A, %B %d, %Y %I:%M:%S %p"  # 12hodinový formát s AM/PM
    else:
        format_string = "%A, %B %d, %Y %H:%M:%S"     # 24hodinový formát
    
    return date.strftime(format_string)

# Příklad použití
timestamp = 1609459200  # 1. ledna 2021 00:00:00 UTC
print(convert_unix_timestamp(timestamp, False))  # 24hodinový formát
print(convert_unix_timestamp(timestamp, True))   # 12hodinový formát
<?php
// PHP převod časového razítka
function convertUnixTimestamp($timestamp, $use12Hour = false) {
    // Formátovací řetězec
    $formatString = $use12Hour 
        ? 'l, F j, Y g:i:s A'  // 12hodinový formát s AM/PM
        : 'l, F j, Y H:i:s';   // 24hodinový formát
    
    // Převést a formátovat datum
    return date($formatString, $timestamp);
}

// Příklad použití
$timestamp = 1609459200; // 1. ledna 2021 00:00:00 UTC
echo convertUnixTimestamp($timestamp, false) . "\n"; // 24hodinový formát
echo convertUnixTimestamp($timestamp, true) . "\n";  // 12hodinový formát
?>
// Java převod časového razítka
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) {
        // Převést Unixové časové razítko na Instant, poté na LocalDateTime
        Instant instant = Instant.ofEpochSecond(timestamp);
        LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
        // Vytvořit formátovač na základě 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átovat datum
        return dateTime.format(formatter);
    }
    
    public static void main(String[] args) {
        long timestamp = 1609459200; // 1. ledna 2021 00:00:00 UTC
        System.out.println(convertUnixTimestamp(timestamp, false)); // 24hodinový formát
        System.out.println(convertUnixTimestamp(timestamp, true));  // 12hodinový formát
    }
}
// C# převod časového razítka
using System;

class UnixTimestampConverter
{
    public static string ConvertUnixTimestamp(long timestamp, bool use12Hour)
    {
        // Převést Unixové časové razítko na DateTime
        // Unixové časové razítko je sekundy od 1970-01-01
        DateTime dateTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime;
        
        // Formátovací řetězec na základě 12hodinové nebo 24hodinové preference
        string formatString = use12Hour 
            ? "dddd, MMMM d, yyyy h:mm:ss tt"  // 12hodinový formát s AM/PM
            : "dddd, MMMM d, yyyy HH:mm:ss";   // 24hodinový formát
        
        // Vrátit formátovaný řetězec
        return dateTime.ToString(formatString);
    }
    
    static void Main()
    {
        long timestamp = 1609459200; // 1. ledna 2021 00:00:00 UTC
        Console.WriteLine(ConvertUnixTimestamp(timestamp, false)); // 24hodinový formát
        Console.WriteLine(ConvertUnixTimestamp(timestamp, true));  // 12hodinový formát
    }
}
# Ruby převod časového razítka
require 'time'

def convert_unix_timestamp(timestamp, use_12hour = false)
  # Převést Unixové časové razítko na objekt Time
  time = Time.at(timestamp)
  
  # Formát na základě 12hodinové nebo 24hodinové preference
  if use_12hour
    time.strftime("%A, %B %d, %Y %I:%M:%S %p")  # 12hodinový formát s AM/PM
  else
    time.strftime("%A, %B %d, %Y %H:%M:%S")     # 24hodinový formát
  end
end

# Příklad použití
timestamp = 1609459200  # 1. ledna 2021 00:00:00 UTC
puts convert_unix_timestamp(timestamp, false)  # 24hodinový formát
puts convert_unix_timestamp(timestamp, true)   # 12hodinový formát
// Go převod časového razítka
package main

import (
    "fmt"
    "time"
)

func convertUnixTimestamp(timestamp int64, use12Hour bool) string {
    // Převést Unixové časové razítko na čas
    t := time.Unix(timestamp, 0)
    
    // Formátovací řetězec na základě 12hodinové nebo 24hodinové preference
    formatString := "Monday, January 2, 2006 "
    if use12Hour {
        formatString += "3:04:05 PM"  // 12hodinový formát s AM/PM
    } else {
        formatString += "15:04:05"    // 24hodinový formát
    }
    
    // Vrátit formátovaný čas
    return t.Format(formatString)
}

func main() {
    timestamp := int64(1609459200) // 1. ledna 2021 00:00:00 UTC
    fmt.Println(convertUnixTimestamp(timestamp, false)) // 24hodinový formát
    fmt.Println(convertUnixTimestamp(timestamp, true))  // 12hodinový formát
}
// Swift převod časového razítka
import Foundation

func convertUnixTimestamp(_ timestamp: Int, use12Hour: Bool) -> String {
    // Vytvořit datum z Unixového časového razítka
    let date = Date(timeIntervalSince1970: TimeInterval(timestamp))
    
    // Vytvořit DateFormatter
    let formatter = DateFormatter()
    formatter.dateStyle = .full
    
    // Nastavit časový styl na základě 12hodinové nebo 24hodinové preference
    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átit formátované datum
    return formatter.string(from: date)
}

// Příklad použití
let timestamp = 1609459200 // 1. ledna 2021 00:00:00 UTC
print(convertUnixTimestamp(timestamp, use12Hour: false)) // 24hodinový formát
print(convertUnixTimestamp(timestamp, use12Hour: true))  // 12hodinový formát
# R převod časového razítka
convert_unix_timestamp <- function(timestamp, use_12hour = FALSE) {
  # Převést Unixové časové razítko na POSIXct datetime
  date_time <- as.POSIXct(timestamp, origin = "1970-01-01", tz = "UTC")
  
  # Formát na základě 12hodinové nebo 24hodinové preference
  if (use_12hour) {
    format_string <- "%A, %B %d, %Y %I:%M:%S %p"  # 12hodinový formát s AM/PM
  } else {
    format_string <- "%A, %B %d, %Y %H:%M:%S"     # 24hodinový formát
  }
  
  # Vrátit formátovaný řetězec
  format(date_time, format_string)
}

# Příklad použití
timestamp <- 1609459200  # 1. ledna 2021 00:00:00 UTC
cat(convert_unix_timestamp(timestamp, FALSE), "\n")  # 24hodinový formát
cat(convert_unix_timestamp(timestamp, TRUE), "\n")   # 12hodinový formát
% MATLAB převod časového razítka
function formattedDate = convertUnixTimestamp(timestamp, use12Hour)
    % Převést Unixové časové razítko na datum/čas MATLAB
    % Datum/čas v MATLABu jsou dny od 1. ledna 0000, s 1 = 1. ledna 0000
    % Unixová časová razítka jsou sekundy od 1. ledna 1970
    
    % Nejprve převést na formát Excelu
    % 25569 je počet dnů mezi 1. ledna 0000 a 1. ledna 1970
    excelDate = (timestamp / 86400) + 25569;
    
    % Formát na základě 12hodinové nebo 24hodinové preference
    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

% Příklad použití
timestamp = 1609459200;  % 1. ledna 2021 00:00:00 UTC
disp(convertUnixTimestamp(timestamp, false))  % 24hodinový formát
disp(convertUnixTimestamp(timestamp, true))   % 12hodinový formát
' Excel VBA převod časového razítka
Function ConvertUnixTimestamp(timestamp As Long, Optional use12Hour As Boolean = False) As String
    ' Převést Unixové časové razítko na datum/čas v Excelu
    ' Excel data jsou dny od 1. ledna 1900, s 1 = 1. ledna 1900
    ' Unixová časová razítka jsou sekundy od 1. ledna 1970
    
    ' Nejprve převést na Excel datum
    ' 25569 je počet dnů mezi 1. ledna 1900 a 1. ledna 1970
    Dim excelDate As Double
    excelDate = (timestamp / 86400) + 25569
    
    ' Formátovací řetězec na základě 12hodinové nebo 24hodinové preference
    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žití v pracovním listu:
' =ConvertUnixTimestamp(1609459200, TRUE)  ' 12hodinový formát
' =ConvertUnixTimestamp(1609459200, FALSE) ' 24hodinový formát

Řešení hraničních případů

Při práci s Unixovými časovými razítky je důležité správně zpracovávat hraniční případy. Zde jsou příklady zpracování některých běžných hraničních případů:

// JavaScript zpracování hraničních případů
function safeConvertTimestamp(timestamp, use12Hour = false) {
  // Zkontrolovat, zda je časové razítko platné
  if (timestamp === undefined || timestamp === null || isNaN(timestamp)) {
    return "Neplatné časové razítko";
  }
  
  // Zkontrolovat negativní časová razítka (data před 1970)
  if (timestamp < 0) {
    // Některé prohlížeče nemusí správně zpracovávat negativní časová razítka
    // Použijte robustnější přístup pro data před 1970
    const date = new Date(timestamp * 1000);
    if (isNaN(date.getTime())) {
      return "Neplatné datum (před 1970)";
    }
  }
  
  // Zkontrolovat problém Y2K38 (pro 32bitové systémy)
  const maxInt32 = 2147483647; // Maximální hodnota pro 32bitové podepsané celé číslo
  if (timestamp > maxInt32) {
    // Zvažte použití BigInt pro velmi velká časová razítka v moderním JavaScriptu
    console.warn("Časové razítko překračuje limit 32bitového celého čísla (problém Y2K38)");
  }
  
  // Pokračovat s normálním převodem
  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 při převodu časového razítka: " + 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. "Složitosti kalendářního č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: Datum a čas na internetu: Časová razítka." 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