Come si converte una data JavaScript in UTC?


590

Supponiamo che un utente del tuo sito Web inserisca un intervallo di date.

2009-1-1 to 2009-1-3

È necessario inviare questa data a un server per l'elaborazione, ma il server prevede che tutte le date e gli orari siano in UTC.

Supponiamo ora che l'utente sia in Alaska, alle Hawaii o alle Figi. Poiché si trovano in un fuso orario piuttosto diverso da UTC, l'intervallo di date deve essere convertito in qualcosa del genere:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

Utilizzando l'oggetto JavaScript Date, come converti il ​​primo intervallo di date "localizzato" in qualcosa che il server capirà?


10
questo è risorto perché è stato il principale successo di Google per me e i browser più recenti hanno il supporto integrato per le stringhe di data UTC.
jcomeau_ictx,

4
Ho aggiornato la risposta accettata per evidenziare il nuovo metodo ECMAscript 5 su ISOString (). Vedere stackoverflow.com/a/11957822/19112
dthrasher

5
quindi nel 2015 devo fare casino con le date di analisi e analisi? ridicolo!
Toolkit,

2
Certo che hai. Non puoi mai fare affidamento su qualcun altro che fa il lavoro per te :-P Almeno fino a quando il mondo non smette di usare i fusi orari e inizia a unificare le date e gli orari.
Erenor Paz,

4
"Stardates", preferibilmente.
Michael Daw,

Risposte:


370

Il toISOString()metodo restituisce una stringa in formato ISO esteso semplificato ( ISO 8601 ), che è sempre lunga 24 o 27 caratteri ( YYYY-MM-DDTHH:mm:ss.sssZo ±YYYYYY-MM-DDTHH:mm:ss.sssZ, rispettivamente). Il fuso orario è sempre zero UTC offset, come indicato dal suffisso " Z".

Fonte: documenti web MDN

Il formato necessario è creato con il .toISOString()metodo Per i browser meno recenti (ie8 e precedenti), che non supportano nativamente questo metodo, lo shim può essere trovato qui :

Questo ti darà la possibilità di fare ciò di cui hai bisogno:

var isoDate = new Date('yourdatehere').toISOString();

Per il fuso orario , time.js e moment.js sono strumenti davvero preziosi ... soprattutto per la navigazione dei fusi orari tra javascript client e server.


81
in realtà questo converte l'oggetto data in una stringa, non sarà in grado di eseguire ulteriori operazioni sulla data su di esso
orszaczky

2
@TheRebel, il caso d'uso indicato è che deve inviare al server una stringa formattata.
Will Stern,

28
@Will, hai perfettamente ragione, ma - proprio come la maggior parte degli spettatori qui presumo - sono arrivato qui in base al titolo, cercando la conversione della data generale da JS a UTC, quindi ho pensato che fosse utile menzionarlo qui :)
orszaczky,

4
Diffidare quando si utilizza questo metodo! Non crea una data UTC, ma formatta i dati della data esistente così com'è in un formato UTC e gli dà un fuso orario "Z". Questo è sbagliato il 99% delle volte! È necessario convertire la data in fuso orario GMT prima di utilizzare questo metodo!
user1944491

5
@ user1944491 Non credo sia corretto. Secondo i documenti MDN, toISOStringsi converte correttamente in UTC. [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetAnche nell'esempio mostrano che l'offset viene preso in considerazione quando si chiama toISOString
FFF

560

Semplice e stupido

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
Mi è piaciuta la tua idea e ho fatto un metodo che ho usato molte volte. function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
Il codice più breve che ho trovato per ottenere la data e l'ora UTC è staccando il fuso orario:new Date(new Date().toUTCString().substr(0, 25))
joelvh

17
Nota che getUTCMonth () restituisce i valori da 0 a 11. Quindi, se hai bisogno del mese per numero anziché una stringa, aiuta a +1 al valore.
Talvi Watia,

19
Questo non ha senso. La nuova data avrà un valore diverso da quello che desideri effettivamente. Basta usare now.toUTCSTring()invece di (sbagliato) now_utc.toString().
Bergi,

22
Non userei questo - usando new Date () si ottiene il fuso orario del browser. in Chrome 29 e IE10, la data + ora sembrano essere corretti, ma il fuso orario è impostato sul fuso orario del browser, il che potrebbe causare problemi ...
Sean,

207

Ecco il mio metodo:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

L' utcoggetto risultante non è in realtà una data UTC, ma una data locale è stata spostata per corrispondere all'ora UTC (vedere i commenti). Tuttavia, in pratica fa il lavoro.


Stavo osservando quel problema quando mi sono reso conto che Date.now()dà l'ora locale e non l'ora UTC, e questa soluzione mi sembra la più semplice. Almeno nel mio caso in cui voglio tempo UNIX e non una stringa ben formattata. (l'unica differenza era che mi sarei moltiplicato 60 * 1000solo per essere più chiaro :))
Timothée Boucher,

18
L'aggiunta di 60000 * Date.getTimezoneOffset () non è corretta! Innanzitutto, devi considerare tutte le date / ore come già UTC con un modificatore del fuso orario per scopi di visualizzazione. I browser possono differire, tuttavia, Date.getTime () restituisce il numero di millisecondi dal 1970-01-01. Se si crea una nuova data utilizzando questo numero, ad esempio: nuova data (Date.getTime ()); esso sarà UTC , tuttavia quando si visualizza esso (es: tramite la console di strumenti di sviluppo Chrome) apparirà per essere il vostro fuso orario locale.
Aaron Hoffman,

15
Nel mio browser, questo crea un DateTime che non è UTC. Tuttavia, quando visualizzato nel mio browser, questo mostra un DateTime nel mio fuso orario locale che sarebbe l'ora UTC corretta se le informazioni sul fuso orario fossero ignorate.
Aaron Hoffman,

Gotcha, punto interessante. Facciamo un confronto now.toString()con utc.toString(): non ci sono cambiamenti nel fuso orario, ma l'alterazione del tempo, che è una cosa completamente diversa. Tuttavia, una soluzione più pulita sarebbe molto più complessa (immagino di sì), e questo codice fa il lavoro nella stragrande maggioranza dei casi, purché non si occupi ulteriormente dei fusi orari. Mi ha fatto venire in mente il pugilato d'anatra : cosa diversa ma fatta per comportarsi allo stesso modo. Nota anche che il codice DrunkCoder ha lo stesso problema.
Gras Double

4
Questa risposta dimostra un'altra implementazione comune del "cambio di epoca" che è pericoloso isolatamente, in quanto può fallire vicino a casi limite come le transizioni dell'ora legale. Non consigliato.
Matt Johnson-Pint,

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

Funziona bene Ho solo bisogno di sostituire "-" nelle mie date di origine in "/" per creare una data JavaScript, quindi ho potuto chiamare la funzione toISO () per ottenere l'output corretto.
Dthrasher,

funziona alla grande. Puoi anche inserire il risultato in jQuery $ .parseDate (...) per recuperare un oggetto data che è stato spostato in UTC.
Brian Ellis,

23

Converti in ISO senza cambiare data / ora

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

Converti in ISO con modifica di data / ora (la data / ora verrà modificata)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

Collegamento a violino


quindi questo è una specie di falso UTC? Sposto la mia data locale e riesco a inviare al server la data e l'ora che vedo sul mio orologio PC. Wow. Comunque meglio di strinificare e analizzare
Toolkit

Inoltre non è necessario .toISOString (), puoi semplicemente inviare isoDate al server
Toolkit

.toISOString () è semplice e diretto, uscire da essa sarà un ulteriore passaggio (isoDate non è una funzione).
RollerCosta

Non è necessario aggiungere l'offset invece di sottrarlo? Fare riferimento a stackoverflow.com/a/11964609/832230
Acumenus

@ABB Se l'attuale offset del fuso orario è + ve, dovremmo sottrarlo (nel nostro caso IST è +5: 30) altrimenti aggiungere.
RollerCosta,

18

I browser possono differire e dovresti anche ricordare di non fidarti delle informazioni generate dal client, detto ciò, la seguente dichiarazione funziona per me (Google Chrome v24 su Mac OS X 10.8.2)

var utcDate = new Date(new Date().getTime());


modifica: "In che modo è diverso da solo new Date()?" vedi qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • Se non viene fornito alcun argomento, il costruttore crea un oggetto Date JavaScript per la data e l'ora correnti in base alle impostazioni di sistema.
  • Nota: dove Date viene chiamato come costruttore con più di un argomento, gli argomenti specificati rappresentano l'ora locale. Se si desidera UTC, utilizzare la nuova data ( Date.UTC (...) ) con gli stessi argomenti. (nota: Date.UTC () restituisce il numero di millisecondi dal 1970-01-01 00:00:00 UTC)

L'aggiunta di 60000 * Date.getTimezoneOffset () come indicato nelle risposte precedenti non è corretta. Innanzitutto, devi considerare tutte le date / ore come già UTC con un modificatore del fuso orario per scopi di visualizzazione.

Ancora una volta, i browser possono differire, tuttavia, Date.getTime () restituisce il numero di millisecondi dal 1970-01-01 UTC / GMT. Se crei una nuova data usando questo numero come faccio sopra, sarà UTC / GMT. Tuttavia, se lo visualizzi chiamando .toString () apparirà nel tuo fuso orario locale perché .toString () usa il tuo fuso orario locale, non il fuso orario dell'oggetto Date su cui viene chiamato.

Ho anche scoperto che se chiami .getTimezoneOffset () in una data, restituirà il tuo fuso orario locale, non il fuso orario dell'oggetto data su cui lo hai chiamato (non posso verificare che questo sia standard).

Nel mio browser, l'aggiunta di 60000 * Date.getTimezoneOffset () crea un DateTime che non è UTC . Tuttavia, quando visualizzato nel mio browser (ad es. .ToString ()), visualizza un DateTime nel mio fuso orario locale che sarebbe l'ora UTC corretta se le informazioni sul fuso orario fossero ignorate.


11
Ho appena eseguito questo codice su Fx e Chrome, non sembra funzionare: il risultato è esattamente lo stesso di da new Date(), né il timestamp né il fuso orario sono cambiati
Gras Double

3
Questo perché i timestamp sono senza fuso orario. new Date().getTime()restituirà sempre un timestamp che è agnostico nel fuso orario. Non vi è alcun timestamp associato ad esso fino a quando non si tenta di formattarlo in qualcosa di diverso dal numero di millisecondi dall'epoca di Unix.
frontendbeauty

7
Per quanto ne so, new Date(new Date().getTime())restituisce esattamente lo stesso valore di new Date(). Puoi spiegare in che senso la tua risposta fornisce un valore distinto new Date()?
Kirk Woll,

Sto pubblicando questo valore sul mio server new Date("5/19/2014").getTime(). Il costruttore Date ha creato una data con un offset +7. Sul server (C #), aggiungo il valore registrato come millisecondi per unificare l'epoca new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000). Il risultato è 5/19/2014 7:00:00 AM. Quindi sembra che getTime () dia il numero di millisecondi incluso il mio offset UTC.
xr280xr

1
Ci sono molti commenti che lamentano che new Date(new Date().getTime())non funziona. Posso confermare che new Date(Date.UTC(2019, 8, 27, 0, 0, 0))effettivamente produce l'ora UTC. Se non riesci a utilizzare Date.UTC(...), otterrai le date in offset UTC nel tuo fuso orario.
Alex Barker,

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
L'oggetto data deve essere effettivamente impostato su una data. Sopra è solo un esempio.
James Skidmore,

5
Ora restituisce "Gio, 04 giu 2009 04:10:56 GMT", che non è il formato ISO richiesto nel PO.
Nickf

4
Questo lo trasforma in una stringa, che non è una data
Anthony,

2
no, in realtà dovrebbe essere una rappresentazione in forma di stringa di una data secondo il PO.
jcomeau_ictx,

3
Dopo la conversione in UTC sta tornando in formato stringa, quindi come accedere a metodi come getMonth (), getDate () ecc.
Sandeep sandy

10

Un'altra soluzione per convertire in UTC e mantenerlo come oggetto data: (Funziona rimuovendo la parte 'GMT' dalla fine della stringa formattata, quindi reinserendola nel costruttore della data)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

Ho dovuto farlo per interfacciarmi con una libreria di selezione datetime. Ma in generale è una cattiva idea lavorare con le date in questo modo.

Gli utenti in genere desiderano lavorare con i tempi dei dati nella loro ora locale, quindi aggiorni il codice lato server per analizzare correttamente le stringhe datetime con offset, quindi converti in UTC (opzione migliore) o converti in una stringa UTC lato client prima di inviarlo al server (come nella risposta di Will Stern)


7

Stai cercando di convertire la data in una stringa del genere?

Farei una funzione per farlo e, sebbene sia leggermente controverso, lo aggiungerei al prototipo di Date. Se non ti senti a tuo agio nel farlo, puoi metterlo come funzione autonoma, passando la data come parametro.

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

Se ne avevi bisogno in tempo UTC, sostituisci tutte le funzioni get * con getUTC *, ad esempio: getUTCFullYear, getUTCMonth, getUTCHours ... e quindi aggiungi "+00: 00" alla fine invece dell'offset del fuso orario dell'utente.


1
Questo è il primo esempio che ho visto che tenta di gestire l'offset del fuso orario, quindi +1 per quello. Tuttavia, ho trovato un paio di cose con esso - temp.substr (-2) provoca un errore perché è un numero, non una stringa, quindi è necessario fare qualcosa come "temp = '' + temp;" in primo luogo, per trasformarlo in una stringa. Inoltre, preferisco che le mie date ISO siano a zero: credo che ciò le renda più standard.
Mick Sear,

@Mick - Ho aggiornato per correggere quel bug. Ho usato String(temp)poiché l'altro modo ( "" + temp) è segnalato come un errore JSLint in questi giorni.
Nickf

Questo è ora standardizzato come toISOStringmetodo
Bergi il

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

dovrebbe funzionare nella maggior parte dei browser più recenti. ritorna 2012-07-28T00:00:00.000Zsu Firefox 6.0


7

La mia raccomandazione quando si lavora con le date è di analizzare la data in singoli campi dall'input dell'utente. Puoi usarlo come una stringa completa, ma stai giocando con il fuoco.

JavaScript può trattare due date uguali in diversi formati in modo diverso.

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

Non fare mai niente del genere:

new Date('date as text');

Dopo aver analizzato la tua data nei suoi singoli campi dall'input dell'utente, crea un oggetto data. Una volta creato l'oggetto data, convertilo in UTC aggiungendo l'offset del fuso orario. Non posso sottolineare quanto sia importante utilizzare l'offset dall'oggetto data a causa dell'ora legale (questa è un'altra discussione per mostrare il perché).

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

Ora puoi passare la data al server in ora UTC. Ancora una volta, consiglio vivamente di non utilizzare stringhe di date. Passalo al server suddiviso per la minima granularità di cui hai bisogno, ad esempio anno, mese, giorno, minuto o come valore in millisecondi dall'epoca unix.


FYI getYear è stato rimosso dagli standard web developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ghan

6

Se hai molto a che fare con le date, vale la pena usare moment.js ( http://momentjs.com ). Il metodo per convertire in UTC sarebbe:

moment(yourTime).utc()

Puoi utilizzare il formato per modificare la data in qualsiasi formato desiderato:

moment(yourTime).utc().format("YYYY-MM-DD")

Ci sono anche opzioni di offset al momento, ma c'è una libreria aggiuntiva aggiuntiva per gestire il fuso orario ( http://momentjs.com/timezone/ ). La conversione del tempo sarebbe semplice come questa:

moment.tz(yourUTCTime, "America/New_York")

qual è la differenza tra moment(yourTime).utc()e moment.utc(yourTime)? Di solito uso quest'ultimo.
ps0604,

5

La mia soluzione mantiene la data uguale indipendentemente dal fuso orario impostato sul lato client. Forse qualcuno lo troverà utile.

Il mio caso d'uso:

Sto creando un'app todo, in cui hai impostato la data della tua attività. Questa data dovrebbe rimanere costante, indipendentemente dal fuso orario in cui ti trovi.

Esempio. Vuoi chiamare il tuo amico alle 8 del mattino del 25 giugno.

Questa attività viene creata 5 giorni prima (20 giugno) mentre si è in Cina.

Quindi, lo stesso giorno, voli a New York per alcuni giorni.

Quindi, il 25 giugno, mentre sei ancora a New York, ti ​​svegli alle 7:30 (il che significa che dovresti ricevere la notifica dell'attività in 30 minuti (anche se sono le 13:30 già in Cina dove eri quando hai creato il compito)

Quindi l'attività ignora il fuso orario. Significa "Voglio farlo alle 8 del mattino in qualunque fuso orario sarò".

Quello che faccio è dire "Suppongo che tu sia sempre nel fuso orario di Londra - UTC".

Ciò significa che - quando l'utente sceglie una data nel suo fuso orario - converto questa data nella stessa data in UTC. vale a dire. Scegli le 8 del mattino in Cina, ma le converto alle 8 del mattino in UTC.

Quindi - la prossima volta che apri l'app - ho letto la data salvata in UTC e la converto nella stessa data nel tuo fuso orario corrente - ad es. Converto le 8:00 in UTC alle 8:00 nel fuso orario di New York.

Questa soluzione significa che la data può significare qualcos'altro a seconda di dove ti trovi quando la imposti e dove la stai leggendo, ma rimane costante in un modo in cui "ti senti" come se fossi sempre nello stesso fuso orario.

Scriviamo un po 'di codice:

Primo: abbiamo 2 funzioni principali per la conversione da / in UTC ignorando il fuso orario:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

Quindi, salvo / leggo questa data come:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

Ho appena scoperto che la versione 1.2.3 di date.format.js di Steven Levithan fa esattamente quello che voglio. Ti consente di fornire una stringa di formato per una data JavaScript e convertirà da ora locale a UTC. Ecco il codice che sto usando ora:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
Questa non sembra la migliore risposta alla tua domanda. Dovresti riconsiderare qualcosa che risponda direttamente alla tua domanda o porre la tua domanda in modo diverso.
Hitautodestruct

1
Mi è capitato di FISSARE questo esatto script (e versione) perché non è sufficiente per IE7 e Firefox.
Barbarrosa,

4

Ho trovato che la data del plug-in di globalizzazione jQuery funziona meglio. Altri metodi avevano problemi tra browser e cose come date.js non erano state aggiornate da un po 'di tempo.

Inoltre, non è necessario un DatePicker nella pagina. Puoi semplicemente chiamare qualcosa di simile all'esempio fornito nei documenti:

$.parseDate('yy-mm-dd', '2007-01-26');

1
Solo perché qualcosa non è stato aggiornato, non significa che non dovresti usarlo. Date.js ha funzionato così perfettamente per anni, quindi non ha avuto bisogno di aggiornamenti. L'oggetto data JS e i formati di data in uso non sono cambiati negli ultimi anni, quindi perché lo script che li manipola? Date.JS è assolutamente la migliore libreria JS Date in circolazione. In github ci sono alcuni problemi, ma per il resto è perfetto. github.com/datejs/Datejs
thugsb

3

Questa funzione funziona magnificamente per me.

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

Questo ti darà la data e l'ora UTC corrette.
È perché getTimezoneOffset()ti darà la differenza di fuso orario in minuti. Ti consiglio di non usarlo toISOString()perché l'output sarà nella stringa Quindi in futuro non sarai in grado di manipolare la data


2

Questo è quello che ho fatto in passato:

var utcDateString = new Date(new Date().toUTCString()).toISOString();

2

Se hai bisogno di un oggetto data

Passaggio solo della stringa della data La data presuppone che l'ora venga spostata in base alle 00:00 in base al fuso orario:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

Se aggiungi le ore e i minuti correnti ottieni la data corretta:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

Osservando la tua domanda è chiaro che vuoi solo inviare l'intervallo di date al tuo back-end per un'ulteriore elaborazione post.

Presumo che tu sia conforme alle linee guida standard sui dati che prevedono che i dati siano in un formato particolare. Ad esempio, utilizzo ODATA che è un'API RESTfull che prevede che gli oggetti data e ora siano nel formato: -

AAAA-MM-DDT00: 00: 00.

Ciò può essere facilmente ottenuto tramite lo snippet pubblicato di seguito (si prega di cambiare il formato secondo le proprie esigenze).

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

Se d'altra parte, ti trovi nella mia situazione in cui hai ricevuto una data dal tuo back-end e il browser la converte nella tua data locale. D'altra parte sei interessato alla data UTC, quindi puoi eseguire le seguenti operazioni: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

Lo snippet di codice sopra in sostanza aggiunge / sottrae il tempo aggiunto / sottratto dal browser in base al fuso orario.

Ad esempio, se sono in EST (GMT-5) e il mio servizio restituisce un oggetto data / ora = mer 17 ago 2016 00:00:00 GMT-0500 il mio browser sottrae automaticamente la differenza di fuso orario (5 ore) per ottenere l'ora locale. Quindi, se provo a recuperare il tempo che ottengo mer 16 agosto 2016 19:00:00 GMT-0500. Ciò causa molti problemi. Ci sono molte librerie là fuori che renderanno sicuramente più facile questo, ma volevo condividere il puro approccio JS.

Per maggiori informazioni, consultare: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ dove in ho ottenuto il mio ispirazione.

Spero che sia di aiuto!


1

Questo metodo ti darà: 2017-08-04T11:15:00.000+04:30e puoi ignorare la variabile di zona per ottenere semplicemente 2017-08-04T11:15:00.000.

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

Utilizzando il pacchetto moment, puoi facilmente convertire una stringa di data di UTC in un nuovo oggetto Date:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

Ciò è particolarmente utile quando il server non supporta il fuso orario e si desidera memorizzare la data UTC sempre nel server e ripristinarla come nuovo oggetto Date. Il codice sopra ha funzionato per il mio requisito di problema simile per questo thread. Condividere qui in modo che possa aiutare gli altri. Non vedo esattamente sopra la soluzione in nessuna risposta. Grazie.


4
Anche se questo può rispondere alla domanda, non c'è spiegazione del tuo codice. Aggiorna la tua risposta per fornire una spiegazione di ciò che stai facendo. Grazie!
Miroslav Glamuzina,


0

So che questa domanda è vecchia, ma stava esaminando lo stesso problema e un'opzione sarebbe invece di inviare date.valueOf () al server. la funzione valueOf () della data javascript invia il numero di millisecondi dalla mezzanotte del 1 gennaio 1970 UTC.

valore di()


0

Quindi questo è il modo in cui ho dovuto farlo perché volevo ancora un oggetto data JavaScript da manipolare come data e sfortunatamente molte di queste risposte richiedono che tu vada a una stringa.

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

il filato aggiunge un momento

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

Ancora più semplice

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
Questo è incompleto. setTimeconta su new Date, che non si sta includendo. Per favore, completa la risposta.
random_user_name

quest'uomo è ancora vivo? perché non tornare nemmeno da noi, dire qualcosa o modificare la risposta?
Senza speranza
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.