Ottieni un'epoca per una data specifica utilizzando Javascript


Risposte:


182

Puoi creare un Dateoggetto e richiamarlo getTime:

new Date(2010, 6, 26).getTime() / 1000

12
L'argomento del mese per il costruttore della data manca di un po 'di coerenza ed è in realtà a base zero. Questo significa che il 7 è agosto, quindi devi sottrarre 1 :-)
Andy E

6
@ Anddy - è un'idea stravagante compensare i mesi di -1 mantenendo il resto, ed è esattamente il tipo di cosa che può far impazzire una navetta spaziale, se JavaScript dovesse mai essere usato lì :)
Anurag

6
Probabilmente è meglio andare: nuova data ("2010-7-26"). GetTime () / 1000 in modo da non dover pensare agli offset.
Vincent McNabb

5
@ Vincent: new Date("2010-7-26")non analizzerà in Internet Explorer. Il costruttore di date si basa sul metodo Date.parse () quando viene passata una stringa, che dipende dall'implementazione in ECMA-262 3a edizione e, di conseguenza, notoriamente inflessibile in IE.
Andy E

Si potrebbero minimizzare possibili errori o incomprensioni anche specificando il fuso orario. Almeno le attuali versioni (Linux-) di Firefox, Opera e Chrome supportano l'istanza di una data JavaScript come la nuova Data ("1 gennaio 1970 GMT + 00: 00, 00:01"); che riduce anche la confusione sul formato del mese corretto.
Michael Besteck



2

È inoltre possibile utilizzare la funzione Date.now ().


1

Alcune risposte non spiegano gli effetti collaterali delle variazioni nel fuso orario per l'oggetto Data JavaScript. Quindi dovresti considerare questa risposta se questa è una preoccupazione per te.

Metodo 1: dipendente dal fuso orario della macchina

Per impostazione predefinita, JavaScript restituisce una data considerando il fuso orario della macchina, quindi il getTime()risultato varia da computer a computer. Puoi verificare questo comportamento eseguendo:

new Date(1970, 0, 1, 0, 0, 0, 0).getTime()
    // Since 1970-01-01 is Epoch, you may expect ZERO
    // but in fact the result varies based on computer's timezone

Questo non è un problema se vuoi davvero l'ora da Epoch considerando il tuo fuso orario. Quindi, se vuoi ottenere il tempo dall'Epoch per la data corrente o anche una data specificata in base al fuso orario del computer , sei libero di continuare a utilizzare questo metodo.

// Seconds since Epoch (Unix timestamp format)

new Date().getTime() / 1000             // local Date/Time since Epoch in seconds
new Date(2020, 11, 1).getTime() / 1000  // time since Epoch to 2020-12-01 00:00 (local timezone) in seconds

// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)

new Date().getTime()                    // local Date/Time since Epoch in milliseconds
new Date(2020,  0, 2).getTime()         // time since Epoch to 2020-01-02 00:00 (local timezone) in milliseconds

// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)

Metodo 2: indipendente dal fuso orario della macchina

Tuttavia, se si desidera ottenere una corsa delle variazioni nel fuso orario e ottenere l'ora dall'Epoch per una data specificata in UTC (ovvero, indipendentemente dal fuso orario), è necessario utilizzare il Date.UTCmetodo o spostare la data dal fuso orario a UTC:

Date.UTC(1970,  0, 1)
    // should be ZERO in any computer, since it is ZERO the difference from Epoch

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()  // difference in milliseconds between your timezone and UTC
    (new Date(1970,  0, 1).getTime() - timezone_diff)
    // should be ZERO in any computer, since it is ZERO the difference from Epoch

Quindi, utilizzando questo metodo (o, in alternativa, sottraendo la differenza), il risultato dovrebbe essere:

// Seconds since Epoch (Unix timestamp format)

Date.UTC(2020,  0, 1) / 1000  // time since Epoch to 2020-01-01 00:00 UTC in seconds

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()
    (new Date(2020,  0, 1).getTime() - timezone_diff) / 1000  // time since Epoch to 2020-01-01 00:00 UTC in seconds
    (new Date(2020, 11, 1).getTime() - timezone_diff) / 1000  // time since Epoch to 2020-12-01 00:00 UTC in seconds

// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)

Date.UTC(2020,  0, 2)   // time since Epoch to 2020-01-02 00:00 UTC in milliseconds

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()
    (new Date(2020,  0, 2).getTime() - timezone_diff)         // time since Epoch to 2020-01-02 00:00 UTC in milliseconds

// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)

IMO, a meno che tu non sappia cosa stai facendo (vedi nota sopra), dovresti preferire il Metodo 2 , poiché è indipendente dalla macchina.


Nota finale

Sebbene le raccomandazioni in questa risposta, e poiché Date.UTCnon funzionano senza una data / ora specificata, potresti essere incline a utilizzare l'approccio alternativo e fare qualcosa del genere:

const timezone_diff = new Date(1970, 0, 1).getTime()
(new Date().getTime() - timezone_diff)  // <-- !!! new Date() without arguments
    // means "local Date/Time subtracted by timezone since Epoch" (?)

Questo non ha alcun senso e probabilmente è SBAGLIATO (stai modificando la data). Sii consapevole di non farlo. Se vuoi ottenere il tempo da Epoch dalla data E ORA correnti , molto probabilmente stai bene usando il Metodo 1 .


1

Date.parse()analizza una rappresentazione di stringa di una data e restituisce il numero di millisecondi da allora January 1, 1970, 00:00:00 UTC.

const unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT');
const javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT');

console.log(unixTimeZero);
// expected output: 0

console.log(javaScriptRelease);
// expected output: 818035920000

Scopri di più su: Date.parse ()


0
Number(new Date(2010, 6, 26))

Funziona allo stesso modo delle cose sopra. Se hai bisogno di secondi, non dimenticare di farlo/ 1000

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.