Converti epoca UTC in data locale


275

Ho combattuto con questo per un po 'ora. Sto cercando di convertire l'epoca in un oggetto data. L'epoca mi viene inviata in UTC. Ogni volta che passi new Date()un'epoca, assume che sia un'epoca locale. Ho provato a creare un oggetto UTC, quindi ad usarlo setTime()per adattarlo all'epoca corretta, ma l'unico metodo che sembra utile è toUTCString()e le stringhe non mi aiutano. Se passo quella stringa in una nuova data, dovrebbe notare che è UTC, ma non lo fa.

new Date( new Date().toUTCString() ).toLocaleString()

Il mio prossimo tentativo è stato quello di provare a fare la differenza tra l'epoca attuale locale e l'epoca attuale UTC, ma non sono stato in grado di ottenere neanche quello.

new Date( new Date().toUTCString() ).getTime() - new Date().getTime()

Mi sta dando solo piccole differenze, sotto 1000, che è in millisecondi.

Eventuali suggerimenti?


11
Il tempo dell'epoca è definito come i millisecondi trascorsi dalla data del 1970 in UTC . Non esiste un'epoca locale! Non sono sicuro di aver capito il tuo problema.
Chetan,

Forse il fuso orario sul computer non è corretto, portando a un valore UTC diverso?
kijin

2
Devi impostare l'orologio sull'ora UTC, se vuoi "vedere" l'ora UTC quando usi toLocaleString (). Midnight UTC è alle 19:00 EST. Se usi new Date (). ToString () invece di localeString otterrai qualcosa del tipo: "Ven 07 gennaio 2011 07:00:00 GMT-0500", che include l'offset.
Kennebec,

Risposte:


467

Penso di avere una soluzione più semplice: impostare la data iniziale sull'epoca e aggiungere unità UTC. Supponi di avere una var di epoca UTC memorizzata in pochi secondi. Che ne dici di 1234567890. Per convertirlo in una data corretta nel fuso orario locale:

var utcSeconds = 1234567890;
var d = new Date(0); // The 0 there is the key, which sets the date to the epoch
d.setUTCSeconds(utcSeconds);

d è ora una data (nel mio fuso orario) impostata su Fri Feb 13 2009 18:31:30 GMT-0500 (EST)


190
FWIW, gli oggetti Date possono essere inizializzati con millisecondi. Quindi, var d = new Date(utcSeconds * 1000)dovrebbe produrre lo stesso risultato.
kurttheviking

54
var d = new Date(1234567890000)restituisce lo stesso risultato
Matjaz Lipus

11
pensavo che forse altri avrebbero potuto ottenere un po 'di chiarezza da un paio di punti: l'oggetto data non viene impostato con un fuso orario "impresso in esso". pensalo come nient'altro che un numero. quel numero è il numero di millisecondi dal 1970 al 1 gennaio UTC, ad oggi (ora anche in UTC). Quindi, ogni volta che crei un oggetto data, è davvero in UTC dietro le quinte. 2. Per visualizzare quella data, è possibile visualizzarla come impostazione locale (toLocaleString () o, in UTC (toUTCString ()). Non è necessario convertire nulla da soli. Costruire con utc millisec, tutto bene. stringa - purché sia ​​nel fuso orario locale.
da Bich,

2
1234567890000 viene trattato come 1234567890, noto anche come problema Y39K ...
muttonUp

1
@muttonUp, con 1000 mulitplication ha funzionato. Ma "problema Y39K" google non sta dando alcun risultato valido. Qualsiasi URL sarà utile
P Satish Patro

239

È facile, new Date()richiede solo millisecondi, ad es

new Date(1394104654000)
> Thu Mar 06 2014 06:17:34 GMT-0500 (EST)

6
Ben fatto! Questa dovrebbe essere considerata davvero la risposta accettata.
Nizar B.

Questo non ha funzionato per me, funziona quando hai il timestamp ma con epoca utc devi impostare manualmente i secondi d'eccs, la risposta accettata è la risposta giusta
sameerali

12
Questa è una risposta appropriata Nuova data potrebbe richiedere millisecondi, quindi basta moltiplicare per 1000: const d = new Date(epoch * 1000).
Vinyll

@sameerali Forse hai avuto qualche problema diverso con il tuo sistema o sei confuso. Questa risposta è la risposta corretta. La definizione dell'epoca di Unix: numero di secondi trascorsi dal 1 ° mezzanotte UTC . Basta moltiplicare per 1000 per ottenere il numero di millisecondi trascorsi.
nalply

32

E solo per i registri, l'ho fatto usando la libreria Moment.js , che stavo usando comunque per la formattazione.

moment.utc(1234567890000).local()
>Fri Feb 13 2009 19:01:30 GMT-0430 (VET)

1
Il momento è bello, ma è pazzesco usare una libreria da 1,3 MB per convertire solo un'epoca in una data. Non c'è da stupirsi che ci siano così tante app nodo gonfio là fuori.
not2qubit

20

Il tempo di epoca è in secondi dal 1 ° gennaio 1970. date.getTime()restituisce millisecondi dal 1 ° gennaio 1970, quindi .. se si dispone di un timestamp di epoca, convertirlo in un timestamp javascript moltiplicando per 1000.

   function epochToJsDate(ts){
        // ts = epoch timestamp
        // returns date obj
        return new Date(ts*1000);
   }

   function jsDateToEpoch(d){
        // d = javascript date obj
        // returns epoch timestamp
        return (d.getTime()-d.getMilliseconds())/1000;
   }

Mi chiedevo cosa diavolo fosse successo. Molto bene sapere che epochTime! == javascriptTime quando si parla di analisi. Grazie!
GrayedFox

16
 function ToLocalDate (inDate) {
    var date = new Date();
    date.setTime(inDate.valueOf() - 60000 * inDate.getTimezoneOffset());
    return date;
}

1
Mi hai reso felice. TY. Ho appena sostituito il segno meno con un segno più per il mio lavoro.
Ludovic Kuty

5

Per convertire il tempo di epoca corrente in [ms] in un tempo di 24 ore. Potrebbe essere necessario specificare l'opzione per disabilitare il formato 12 ore .

$ node.exe -e "var date = new Date(Date.now()); console.log(date.toLocaleString('en-GB', { hour12:false } ));"

2/7/2018, 19:35:24

o come JS:

var date = new Date(Date.now()); 
console.log(date.toLocaleString('en-GB', { hour12:false } ));
// 2/7/2018, 19:35:24

console.log(date.toLocaleString('en-GB', { hour:'numeric', minute:'numeric', second:'numeric', hour12:false } ));
// 19:35:24

Nota: l'uso di en-GBqui, è solo una scelta (casuale) di un luogo utilizzando il formato 24 ore, non è il tuo fuso orario!


1
Questo è il modo migliore per ottenere qualsiasi tipo di conversione dal metodo Date. Grazie!
SeaWarrior404,

L'unica cosa che non mi piace con quanto sopra, è che restituisce la data in un formato ambiguo d/m/yyyyo è m/d/yyyy? Il diritto (più logica) modo per visualizzare questo dovrebbe essere: yyyy-mm-dd. Qualche acquirente?
not2qubit

4

Il tempo di epoca (ovvero il tempo di epoca Unix) è quasi sempre il numero di secondi scaduti dal 1 ° gennaio 1970 alle 00:00 (ora UTC), non il numero di millisecondi che alcune delle risposte qui implicite hanno implicato.

https://en.wikipedia.org/wiki/Unix_time

Pertanto, se ti è stato dato un valore di tempo di Unix Epoch probabilmente sarà in secondi e avrà un aspetto simile 1547035195. Se vuoi rendere questo umano leggibile in JavaScript, devi convertire il valore in millisecondi e passare quel valore nel Date(value)costruttore, ad esempio:

const unixEpochTimeMS = 1547035195 * 1000;
const d = new Date(unixEpochTimeMS);
// Careful, the string output here can vary by implementation...
const strDate = d.toLocaleString();

Non è necessario eseguire il d.setUTCMilliseconds(0)passaggio nella risposta accettata perché il Date(value)costruttore JavaScript accetta un valore UTC in millisecondi (non un'ora locale).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax

Si noti inoltre che si dovrebbe evitare di usare il Date(...)costruttore che accetta una rappresentazione datetime stringa, questo non è raccomandato (vedere il link sopra).


3

Stai solo chiedendo di convertire una stringa UTC in una stringa "locale"? Potresti fare:

var utc_string = '2011-09-05 20:05:15';
var local_string = (function(dtstr) {
    var t0 = new Date(dtstr);
    var t1 = Date.parse(t0.toUTCString().replace('GMT', ''));
    var t2 = (2 * t0) - t1;
    return new Date(t2).toString();
})(utc_string);

3

Aggiunta alla risposta sopra di @djechlin

d = '1394104654000';
new Date(parseInt(d));

converte il tempo EPOCH in una data leggibile dall'uomo. Basta non dimenticare che il tipo di tempo EPOCH deve essere un numero intero.


3

La soluzione più semplice che ho trovato a questo, è:

var timestamp = Date.now(), // returns milliseconds since epoch time
    normalisedTime = new Date(timestamp);

Nota che questo non ha la * 1000fine della new Date(timestamp)dichiarazione in quanto questo (per me comunque!) Sembra sempre dare la data sbagliata, cioè invece di dare l'anno 2019, dà l'anno come 51015, quindi tienilo a mente.


2

Se preferisci risolvere i timestamp e le conversioni di date da e verso UTC e l'ora locale senza librerie come moment.js, dai un'occhiata all'opzione di seguito.

Per le applicazioni che utilizzano i timestamp UTC, potrebbe essere necessario mostrare la data nel browser considerando il fuso orario locale e l'ora legale quando applicabile. Modificare una data che si trova in un'altra ora legale anche se nello stesso fuso orario può essere complicato.

Le seguenti estensioni Numbere Dateconsentono di mostrare e ottenere le date nel fuso orario dei timestamp. Ad esempio, supponiamo che tu sia a Vancouver, se stai modificando una data a luglio o a dicembre, può significare che stai modificando una data in PST o PDT.

Ti consiglio di controllare lo snippet di codice in basso per testare questa soluzione.

Conversioni da millisecondi

Number.prototype.toLocalDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() + (value.getTimezoneOffset() / 60));

    return value;
};

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

Conversioni da date

Date.prototype.getUTCTime = function () {
    return this.getTime() - (this.getTimezoneOffset() * 60000);
};

uso

// Adds the timezone and daylight savings if applicable
(1499670000000).toLocalDate();

// Eliminates the timezone and daylight savings if applicable
new Date(2017, 6, 10).getUTCTime();

Guardalo da solo


Questa è la risposta effettiva. Ha funzionato benissimo per me. L'impostazione di una nuova data (0) e l'aggiunta di milliSeconds è uguale alla nuova data (milliSeconds)
Jersey_Guy

1

MODIFICARE

var utcDate = new Date(incomingUTCepoch);
var date = new Date();
date.setUTCDate(utcDate.getDate());
date.setUTCHours(utcDate.getHours());
date.setUTCMonth(utcDate.getMonth());
date.setUTCMinutes(utcDate.getMinutes());
date.setUTCSeconds(utcDate.getSeconds());
date.setUTCMilliseconds(utcDate.getMilliseconds());

EDIT risolto


Ho affrontato questo nel mio secondo esempio. Le differenze che mi dà sono ovunque tra 50 e 900, che è in millisecondi (mostrando il tempo durante l'elaborazione del calcolo, non la differenza effettiva)
Shane Reustle

Nessuno di loro mi aiuta. Manca un metodo setUTCTime, che sarebbe perfetto: P w3schools.com/jsref/jsref_obj_date.asp
Shane Reustle

Non funziona, almeno su Firefox per Ubuntu. Il codice non dovrebbe impostare giorno / mese / anno dopo aver impostato la data.
Simon Kozlov,

@Simon Kozlov In realtà questo è un presupposto errato nell'oggetto data, setDate e getDate si riferiscono al giorno del mese e il problema è che ho usato funzioni come (setUTCDay) che non esiste, sorpreso che sia stato accettato !!
Amjad Masad,

@AmjadMasad La tua risposta sarebbe più utile se mostri anche l'output previsto.
not2qubit

0

Considerando che hai a epoch_timedisposizione,

// for eg. epoch_time = 1487086694.213
var date = new Date(epoch_time * 1000); // multiply by 1000 for milliseconds
var date_string = date.toLocaleString('en-GB');  // 24 hour format


0

@Amjad, buona idea, ma un'implementazione migliore sarebbe:

Date.prototype.setUTCTime = function(UTCTimestamp) {
    var UTCDate = new Date(UTCTimestamp);
    this.setUTCFullYear(UTCDate.getFullYear(), UTCDate.getMonth(), UTCDate.getDate());
    this.setUTCHours(UTCDate.getHours(), UTCDate.getMinutes(), UTCDate.getSeconds(), UTCDate.getMilliseconds());
    return this.getTime();
}

-1

Prima convertilo in String e poi sostituisci il testo del fuso orario.

function convertUnixTime(time) {
  return new Date(time*1000).toString().replace("GMT+0530 (Sri Lanka Standard Time)","");
}
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.