ElectroDesignForgeElectroDesignForge
ElectroDesignForge

Znajdź stronę

Narzędzia PCB
Elementy elektroniczne
Projektowanie
Wyprowadzenia i złącza

Przewody

Dokumentacja
Kalkulatory

Przeliczniki

Strzałki do przeglądania · Enter, aby otworzyć · Esc, aby zamknąć

PodstawySygnały i interfejsy

Znaczniki czasu Unix i czas Epoch

Poznaj epokę Unix, jednostki, UTC, dokładność liczb całkowitych, granice 2038 i 2106 oraz sekundy przestępne na przykładach kodu.

Znacznik czasu wskazuje położenie zdarzenia na określonej skali. Wymiana wartości wymaga ustalenia epoki, jednostki i rodzaju zegara. Licznik od uruchomienia nie jest datą UTC. Konwerter Unix Timestamp / Epoch pozwala sprawdzić wartość i jej lokalny zapis bez wysyłania obliczeń na serwer.

Epoka Unix: dlaczego 1 stycznia 1970?

Początkiem jest 1970-01-01 00:00:00 UTC. To historyczna konwencja systemu Unix, bez szczególnego znaczenia fizycznego. Inna epoka zmienia liczbę, a nie zdarzenie. NTP ma początek w 1900 roku; GPS i liczniki producentów używają innych zasad. Sama liczba nie wskazuje swojej epoki.

Sposób liczenia i wartości ujemne

W zwykłej arytmetyce kalendarza POSIX nominalna doba UTC odpowiada 86400 sekundom. Początek 2 stycznia 1970 UTC ma więc wartość 86400. Nie oznacza to, że każda lokalna doba ma 24 godziny. Wartości dodatnie następują po epoce, a −1 to ostatnia sekunda 1969 roku. Liczbowy znacznik Unix nie zawiera strefy czasowej.

Sekundy, milisekundy, mikrosekundy i nanosekundy

Jednostka znacznika1 s1700000000 s
Sekundy (s)11700000000
Milisekundy (ms)10001700000000000
Mikrosekundy (µs)10000001700000000000000
Nanosekundy (ns)10000000001700000000000000000

Pomnóż sekundy przez 1000, aby uzyskać milisekundy, lub przez miliard dla nanosekund. Dopisanie zer nie poprawia dokładności źródła czasu. JavaScript Date przyjmuje milisekundy; wiele interfejsów C przyjmuje sekundy. Umieszczaj jednostkę w nazwie pola i specyfikacji danych.

UTC, przesunięcie i strefy IANA

2023-11-14 22:13:20 UTC i 23:13:20 w Paryżu to ta sama chwila. +01:00 jest konkretnym przesunięciem, a Europe/Paris opisuje reguły czasu cywilnego i ich zmiany. Skrót CST jest niejednoznaczny między regionami.

Nieistniejące i powtórzone godziny

W Paryżu 2024-03-31 02:30 nie istnieje. Natomiast 2024-10-27 02:30 występuje dwa razy: jako 00:30 UTC oraz 01:30 UTC. Konwerter odrzuca nieistniejące godziny i pozwala wybrać wcześniejsze lub późniejsze wystąpienie powtórzonej. Numer dnia roku wynika z lokalnych pól kalendarza, bez dzielenia lokalnego czasu trwania przez 24 godziny. Wyniki zależą od danych IANA przeglądarki; reguły przyszłe mogą zmieniać się politycznie, a dane historyczne mają ograniczenia.

Szczegółowy przykład i wartości odniesienia

1700000000 s × 1000 = 1700000000000 ms; obie wartości oznaczają 2023-11-14T22:13:20Z. Dodanie 123456789 ns daje 1700000000123456789 ns i część ułamkową .123456789. Date wyświetla .123, a pozostałe 456789 ns konwerter zachowuje oddzielnie.

Sekundy UnixISO 8601 (UTC)
-11969-12-31T23:59:59Z
01970-01-01T00:00:00Z
10000000002001-09-09T01:46:40Z
17000000002023-11-14T22:13:20Z
21474836472038-01-19T03:14:07Z
42949672952106-02-07T06:28:15Z

−1 ns odpowiada 1969-12-31T23:59:59.999999999Z. Zawierająca tę chwilę milisekunda ma wartość −1 ms. Dzielenie całkowite w stronę zera błędnie pokazałoby epokę. Zaokrąglaj iloraz w stronę minus nieskończoności i zachowuj resztę.

Problem roku 2038: 32 bity ze znakiem

Zakres wynosi od −2³¹ do 2³¹−1. Ostatnia dodatnia sekunda, 2147483647, to 2038-01-19T03:14:07Z. Następna nie mieści się w typie. Przepełnienie typu ze znakiem w C ma niezdefiniowane zachowanie; nie zakładaj automatycznego powrotu do 1901 roku. Poszerz operandy przed obliczeniem i sprawdź pola plików oraz protokołów.

Rok 2106: 32 bity bez znaku

Zakres 0–4294967295 kończy się na 2106-02-07T06:28:15Z i nie przedstawia bezpośrednio dat przed 1970 rokiem. Zmiana na unsigned przesuwa granicę i zmienia znaczenie wartości ujemnych, lecz nie zastępuje trwałej migracji formatu.

Zakres 64 bitów i dokładność liczb

64-bitowe sekundy ze znakiem obejmują około 292 miliardów lat w każdą stronę; nanosekundy tej samej szerokości tylko około 292 lata, do roku 2262 po stronie dodatniej. Biblioteka kalendarza może mieć węższy zakres. Binary64 przedstawia wszystkie liczby całkowite dokładnie tylko do 2⁵³−1. Dzisiejsze nanosekundy wymagają BigInt lub ciągów dziesiętnych w JavaScript. 32-bitowy float nie jest dokładnym 32-bitowym licznikiem sekund.

Sekundy przestępne i ograniczenia POSIX

POSIX nie zlicza każdej rzeczywistej sekundy SI od 1970 roku i nie nadaje zwykłego, odrębnego znacznika sekundzie UTC :60. Systemy mogą skakać, powtarzać czas lub wygładzać korektę. Nie przeliczaj do TAI lub GPS z założeniem wiecznie stałego przesunięcia. Różnica wskazań zegara cywilnego nie gwarantuje fizycznego czasu trwania przez korektę.

JavaScript / TypeScript

const timestampNs = BigInt("1700000000123456789");
const divisor = BigInt(1_000_000);
const q = timestampNs / divisor;
const ms = timestampNs < 0 && timestampNs % divisor !== BigInt(0)
  ? q - BigInt(1) : q;
if (ms < BigInt("-8640000000000000") || ms > BigInt("8640000000000000")) {
  throw new RangeError("Date");
}
const iso = new Date(Number(ms)).toISOString();
console.log(iso);
console.log(timestampNs.toString());

Date pokazuje 2023-11-14T22:13:20.123Z, a pierwotna liczba zachowuje cały ułamek. Konwerter sprawdza pełną wartość przed utworzeniem Date i odtwarza ułamek ISO oraz RFC 3339 oddzielnie. RFC 3339 stosuje czterocyfrowe lata, więc poza 0000–9999 wynik jest niedostępny. RFC 2822 pokazuje pełne sekundy i wymaga roku od 1900.

Python bez przejścia przez float

from datetime import datetime, timezone, timedelta

epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
instant = datetime(2023, 11, 14, 22, 13, 20, 123456, tzinfo=timezone.utc)
delta = instant - epoch
timestamp_us = ((delta.days * 86400 + delta.seconds) * 1_000_000
                + delta.microseconds)
restored = epoch + timedelta(microseconds=timestamp_us)
assert restored == instant
print(timestamp_us, restored.isoformat())

Jawne UTC eliminuje zależność od strefy komputera. timedelta zachowuje całkowite mikrosekundy. timestamp() zwraca float, który może zaokrąglać drobne ułamki; datetime nie przechowuje nanosekund. Dla IANA używaj zoneinfo i określ politykę powtórzonych godzin.

C i zapis w systemie wbudowanym

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

int main(void) {
    int64_t seconds = INT64_C(1700000000);
    int64_t milliseconds = seconds * INT64_C(1000);
    int64_t after_2038 = (int64_t)INT32_MAX + INT64_C(1);
    printf("%" PRId64 " %" PRId64 "\n", milliseconds, after_2038);
    return 0;
}

Te iloczyny mieszczą się w int64_t; kod ogólny musi sprawdzać granice przed mnożeniem. 64-bitowy procesor nie gwarantuje 64-bitowego time_t. Bezpośrednia serializacja tego typu zależy od ABI, szerokości i kolejności bajtów. Określ epokę, jednostkę, znak i szerokość w protokole. Więcej przykładów zawiera Znaczniki Unix w systemach wbudowanych, API i bazach danych.

Częste błędy

  • Przekazywanie sekund do Date lub zgadywanie jednostki z długości liczby.
  • Zamiana długiego ciągu na Number przed BigInt i nieodwracalna utrata cyfr.
  • Dwukrotne dodawanie przesunięcia strefy.
  • Akceptowanie 31 lutego przez automatyczną normalizację.
  • Utożsamianie rozdzielczości wyświetlania z dokładnością zegara.

Pytania techniczne

Czy zmiana strefy zmienia znacznik?

Zmienia wyłącznie zapis kalendarzowy tej samej chwili. Interpretacja nowych pól lokalnej daty wymaga natomiast strefy.

Czy liczba ujemna może mieć ułamek?

Tak. −0.5 s to pół sekundy przed epoką. Zachowaj znak i resztę przy zmianie jednostek.

Czy aktualny zegar odpytuje usługę sieciową?

Odczytuje zegar urządzenia bez zapytania NTP. Dokładność zależy od synchronizacji systemu.

Narzędzia i źródła

Konwerter Unix Timestamp / Epoch · Znaczniki Unix w systemach wbudowanych, API i bazach danych · Tolerancja częstotliwości · PPM ↔ Hz.