Cos’è l’Epoch o il timestamp Unix?
Il timestamp Unix, noto anche come tempo Epoch o tempo POSIX, è un sistema per descrivere un istante nel tempo come il numero di secondi trascorsi dall’epoca Unix (00:00:00 UTC il 1° gennaio 1970), esclusi i secondi bisestili. Funge da standard universale per la rappresentazione del tempo in informatica, consentendo calcoli, confronti e sincronizzazioni precise basati sul tempo tra sistemi e applicazioni.
I timestamp Unix sono ampiamente utilizzati nei database, nei sistemi di logging, nelle API e nei sistemi distribuiti per tracciare eventi, pianificare attività e gestire operazioni sensibili al tempo. Tuttavia, il tempo Unix non è una rappresentazione vera e propria dell’UTC a causa dell’esclusione dei secondi bisestili. Molti sistemi legacy memorizzano il tempo Unix come un intero a 32 bit firmato, il quale andrà in overflow il 19 gennaio 2038 alle 03:14:08 UTC, dando origine al problema del 2038.
Cosa succede il 19 gennaio 2038?
Il problema del 2038 (Y2038, Epochalypse o Unix Y2K) è un problema critico per i sistemi che utilizzano un intero a 32 bit firmato per memorizzare il tempo Unix. Questi sistemi non possono rappresentare istanti successivi alle 03:14:07 UTC del 19 gennaio 2038, poiché verrà superato il valore massimo (2.147.483.647 secondi). Quando viene incrementato, il timestamp andrà in overflow, diventando un numero negativo e facendo sì che i sistemi lo interpretino erroneamente come il 13 dicembre 1901.
Questo overflow di interi può interrompere i sistemi critici in aree come le transazioni finanziarie, l’aviazione, la sanità e l’infrastruttura, dove la misurazione precisa del tempo è essenziale. Per mitigare questo problema, i sistemi moderni stanno passando agli interi a 64 bit, che possono rappresentare il tempo per miliardi di anni nel futuro. È anche incoraggiato ai sviluppatori di aggiornare i sistemi legacy e adottare librerie solide per la gestione del tempo per prevenire i guasti legati al Y2038.
Come ottenere l’istante di tempo Epoch corrente in diversi linguaggi di programmazione?
PHP
$epoch = time();
Javascript
var epoch = Math.floor(Date.now() / 1000);
Typescript
let epoch: number = Math.floor(Date.now() / 1000);
C++
#include <chrono>
auto epoch = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch()).count();
Java
long epoch = System.currentTimeMillis() / 1000;
Rust
use std::time::{SystemTime, UNIX_EPOCH};
let epoch = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs();
Go
import "time"
epoch := time.Now().Unix()
Swift
import Foundation
let epoch = Int(Date().timeIntervalSince1970)
Bash Shell
epoch=$(date +%s)
C#
long epoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
MySQL
SELECT UNIX_TIMESTAMP(NOW());
MATLAB
epoch = posixtime(datetime('now'));
VBA
Dim epoch As Long
epoch = DateDiff("s", "1/1/1970", Now())