Converti l'ora della data UTC nell'ora della data locale


337

Dal server ottengo una variabile datetime in questo formato: 6/29/2011 4:52:48 PMed è in ora UTC. Voglio convertirlo al tempo del browser dell'utente corrente utilizzando JavaScript.

Come è possibile farlo utilizzando JavaScript o jQuery?



1
Stai attento. È un formato data strano, quindi assicurati di specificarlo in qualsiasi soluzione tu usi. Se possibile, fai in modo che il server invii la data in formato ISO.
Michael Scheper,

Risposte:


404

Aggiungi 'UTC' alla stringa prima di convertirla in una data in javascript:

var date = new Date('6/29/2011 4:52:48 PM UTC');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"

5
funzione localizeDateStr (date_to_convert_str) {var date_to_convert = new Date (date_to_convert_str); var local_date = new Date (); date_to_convert.setHours (date_to_convert.getHours () + local_date.getTimezoneOffset ()); return date_to_convert.toString (); }
matt

4
@matt offImpostare restituisce minuti, non ore, è necessario dividere per 60
pugno di pelo

50
Ciò presuppone che la parte della data della stringa segua lo standard americano, mm / gg / AAAA, che non è ovviamente il caso in Europa e in altre parti del mondo.
AsGoodAsIt Ottiene il

7
@digitalbath Funziona su Chrome ma non funziona su Firefox.
Ganesh Satpute,


138

Dal mio punto di vista i server dovrebbero sempre, nel caso generale, restituire un datetime nel formato standardizzato ISO 8601 .

Maggiori informazioni qui:

In questo caso, il server restituisce il valore '2011-06-29T16:52:48.000Z'che viene immesso direttamente nell'oggetto JS Date.

var utcDate = '2011-06-29T16:52:48.000Z';  // ISO-8601 formatted date returned from server
var localDate = new Date(utcDate);

Il localDatesarà nel tempo locale destra che nel mio caso sarebbe due ore più tardi (tempo di DK).

Non devi davvero fare tutto questo analisi che complica semplicemente le cose, purché tu sia coerente con quale formato aspettarti dal server.


1
come ottenere la data del formato ISO? sto ottenendo la data in formato UTC con UTC aggiunto alla fine
Deepika,

8
@Colin dipende dalla lingua. In C # puoi formattare un DateTimeoggetto con il .toString("o")quale restituisce una stringa formattata ISO-8601 come mostrato sopra. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx In javascript è new Date().toISOString(). developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Hulvej

99

Questa è una soluzione universale:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime()+date.getTimezoneOffset()*60*1000);

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

    newDate.setHours(hours - offset);

    return newDate;   
}

Uso:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

Visualizza la data in base all'impostazione locale del client:

date.toLocaleString();

41
Non funziona con tutti i fusi orari. C'è una buona ragione per cui getTimeZoneOffset è in pochi minuti! geographylists.com/list20d.html
siukurnin

5
@siukurnin. quindi per gestire un fuso orario strano, usa newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre,

18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) sarebbe sufficiente. Corregge anche le ore
Lu55,

1
Abbastanza sicuro che questo non possa funzionare per qualsiasi fuso orario con una durata di 30 minuti? Sembra arrotondare per ore intere.
NickG

2
Anche questo non sembra impostare correttamente la data quando lo spostamento del fuso orario attraversa la mezzanotte; forse perché usa solo setHours che non influisce sulla data?
Unifonico

37

Dovresti ottenere l'offset (UTC) (in minuti) del client:

var offset = new Date().getTimezoneOffset();

E quindi fare l'aggiunta corrispondente o la sottrazione al tempo che si ottiene dal server.

Spero che questo ti aiuti.


2
Che dire dell'ora legale?
Ricco

26

Per me sopra le soluzioni non hanno funzionato.

Con IE la conversione di data e ora UTC in locale è un po 'complicata. Per me, la data-ora dall'API Web è '2018-02-15T05:37:26.007'e volevo convertire secondo il fuso orario locale, quindi ho usato sotto il codice in JavaScript.

var createdDateTime = new Date('2018-02-15T05:37:26.007' + 'Z');

21

Metti questa funzione nella tua testa:

<script type="text/javascript">
function localize(t)
{
  var d=new Date(t+" UTC");
  document.write(d.toString());
}
</script>

Quindi genera quanto segue per ogni data nel corpo della tua pagina:

<script type="text/javascript">localize("6/29/2011 4:52:48 PM");</script>

Per rimuovere il GMT e il fuso orario, modificare la seguente riga:

document.write(d.toString().replace(/GMT.*/g,""));

20

Questo funziona per me:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
    return newDate;   
}

10

Dopo aver provato alcuni altri pubblicati qui senza buoni risultati, questo sembra funzionare per me:

convertUTCDateToLocalDate: function (date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),  date.getHours(), date.getMinutes(), date.getSeconds()));
}

E questo funziona in modo opposto, da Local Date a UTC:

convertLocalDatetoUTCDate: function(date){
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),  date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}

1
Meno codice da usare new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG

non funzionerà, il mio tempo in utc è "2020-04-02T11: 09: 00", quindi ho provato questo da Singapore, nuova data (+ nuova data ("2020-04-02T11: 09: 00") + nuova data ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), dando il tempo sbagliato
AhammadaliPK

ha funzionato, nuova data ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK,

10

Aggiungi il fuso orario alla fine, in questo caso 'UTC':

theDate = new Date( Date.parse('6/29/2011 4:52:48 PM UTC'));

successivamente, utilizzare le famiglie di funzioni toLocale () * per visualizzare la data nella locale corretta

theDate.toLocaleString();  // "6/29/2011, 9:52:48 AM"
theDate.toLocaleTimeString();  // "9:52:48 AM"
theDate.toLocaleDateString();  // "6/29/2011"

9

Alla risposta di Matt manca il fatto che l'ora legale potrebbe essere diversa tra Date () e la data in cui deve essere convertita - ecco la mia soluzione:

    function ConvertUTCTimeToLocalTime(UTCDateString)
    {
        var convertdLocalTime = new Date(UTCDateString);

        var hourOffset = convertdLocalTime.getTimezoneOffset() / 60;

        convertdLocalTime.setHours( convertdLocalTime.getHours() + hourOffset ); 

        return convertdLocalTime;
    }

E i risultati nel debugger:

UTCDateString: "2014-02-26T00:00:00"
convertdLocalTime: Wed Feb 26 2014 00:00:00 GMT-0800 (Pacific Standard Time)

9

Utilizzalo per la conversione di ora locale e UTC e viceversa.

//Covert datetime by GMT offset 
//If toUTC is true then return UTC time other wise return local time
function convertLocalDateToUTCDate(date, toUTC) {
    date = new Date(date);
    //Local time converted to UTC
    console.log("Time: " + date);
    var localOffset = date.getTimezoneOffset() * 60000;
    var localTime = date.getTime();
    if (toUTC) {
        date = localTime + localOffset;
    } else {
        date = localTime - localOffset;
    }
    date = new Date(date);
    console.log("Converted time: " + date);
    return date;
}

3
cosa è successo all'ora legale.
Fuso


9

Questa è una soluzione semplificata basata sulla risposta di Adorjan Princ:

function convertUTCDateToLocalDate(date) {
    var newDate = new Date(date);
    newDate.setMinutes(date.getMinutes() - date.getTimezoneOffset());
    return newDate;
}

Uso:

var date = convertUTCDateToLocalDate(new Date(date_string_you_received));

Perché questo è stato ridimensionato il 9 ottobre 2017? Scrivi un commento per aiutarmi a capire la tua opinione.
huha,

9

Nel caso in cui non ti dispiaccia usare moment.jse il tuo tempo sia in UTC, usa quanto segue:

moment.utc('6/29/2011 4:52:48 PM').toDate();

se il tuo tempo non è in utc ma in altre impostazioni locali conosciute, utilizza quanto segue:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY', 'fr').toDate();

se il tuo orario è già in locale, utilizza quanto segue:

moment('6/29/2011 4:52:48 PM', 'MM-DD-YYYY');

5

Per me il più semplice sembrava usare

datetime.setUTCHours(datetime.getHours());
datetime.setUTCMinutes(datetime.getMinutes());

(Ho pensato che la prima riga potesse essere sufficiente, ma ci sono fusi orari che si spengono in poche ore)


Qualcuno ha qualche problema con questo? Questa mi sembra l'opzione migliore. Ho preso una stringa UTC che aveva "(UTC)" alla fine, l'ho impostata come un oggetto Date new Date('date string')e poi ho aggiunto queste due righe e sembra che stia tornando con un tempo basato completamente sul timestamp UTC del server con le modifiche apportate per adattarlo all'ora locale dell'utente. Devo anche preoccuparmi delle strane
fasce orarie delle

ho provato molte altre opzioni, nessuna delle quali ha funzionato, ma questo funziona
Sameera K

5

Una stringa di date JSON (serializzata in C #) sembra "2015-10-13T18: 58: 17".

In angolare, (seguendo Hulvej) crea un localdatefiltro:

myFilters.filter('localdate', function () {
    return function(input) {
        var date = new Date(input + '.000Z');
        return date;
    };
})

Quindi, visualizza l'ora locale come:

{{order.createDate | localdate | date : 'MMM d, y h:mm a' }}

3

Utilizzando il YYYY-MM-DD hh:mm:ssformato:

var date = new Date('2011-06-29T16:52:48+00:00');
date.toString() // "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"

Per la conversione dal YYYY-MM-DD hh:mm:ssformato, assicurati che la tua data segua il formato ISO 8601 .

Year: 
    YYYY (eg 1997)    
Year and month: 
    YYYY-MM (eg 1997-07)
Complete date: 
    YYYY-MM-DD (eg 1997-07-16)
Complete date plus hours and minutes:
    YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)    
Complete date plus   hours, minutes and seconds:
    YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)    
Complete date plus hours, minutes, seconds and a decimal fraction of a second
    YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45+01:00) where:

YYYY = four-digit year
MM   = two-digit month (01=January, etc.)
DD   = two-digit day of month (01 through 31)
hh   = two digits of hour (00 through 23) (am/pm NOT allowed)
mm   = two digits of minute (00 through 59)
ss   = two digits of second (00 through 59)
s    = one or more digits representing a decimal fraction of a second
TZD  = time zone designator (Z or +hh:mm or -hh:mm)

Cose importanti da notare

  1. È necessario separare la data e l'ora da un T, uno spazio non funzionerà in alcuni browser
  2. Devi impostare il fuso orario usando questo formato +hh:mm, usando una stringa per un fuso orario (es. 'UTC') non funzionerà in molti browser. +hh:mmrappresenta l'offset dal fuso orario UTC.

3

@Adorojan'sla risposta è quasi corretta. Ma l'aggiunta dell'offset non è corretta poiché il valore dell'offset sarà negativo se la data del browser è in anticipo rispetto al GMT e viceversa. Di seguito è la soluzione con cui sono arrivato e che funziona perfettamente per me:

// Input time in UTC
var inputInUtc = "6/29/2011 4:52:48";

var dateInUtc = new Date(Date.parse(inputInUtc+" UTC"));
//Print date in UTC time
document.write("Date in UTC : " + dateInUtc.toISOString()+"<br>");

var dateInLocalTz = convertUtcToLocalTz(dateInUtc);
//Print date in local time
document.write("Date in Local : " + dateInLocalTz.toISOString());

function convertUtcToLocalTz(dateInUtc) {
		//Convert to local timezone
		return new Date(dateInUtc.getTime() - dateInUtc.getTimezoneOffset()*60*1000);
}


3

Per me funziona bene

if (typeof date === "number") {
  time = new Date(date).toLocaleString();
  } else if (typeof date === "string"){
  time = new Date(`${date} UTC`).toLocaleString();
}

2

I Rispondendo a questo Se qualcuno vuole una funzione che visualizzi il tempo convertito in un elemento id specifico e applichi la stringa del formato della data yyyy-mm-dd qui date1 è stringa e ids è l'id dell'elemento che quel tempo sta per visualizzare.

function convertUTCDateToLocalDate(date1, ids) 
{
  var newDate = new Date();
  var ary = date1.split(" ");
  var ary2 = ary[0].split("-");
  var ary1 = ary[1].split(":");
  var month_short = Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
  newDate.setUTCHours(parseInt(ary1[0]));
  newDate.setUTCMinutes(ary1[1]);
  newDate.setUTCSeconds(ary1[2]);
  newDate.setUTCFullYear(ary2[0]);
  newDate.setUTCMonth(ary2[1]);
  newDate.setUTCDate(ary2[2]);
  ids = document.getElementById(ids);
  ids.innerHTML = " " + newDate.getDate() + "-" + month_short[newDate.getMonth() - 1] + "-" + newDate.getFullYear() + " " + newDate.getHours() + ":" + newDate.getMinutes() + ":" + newDate.getSeconds();
            }

so che la risposta è già stata accettata ma arrivo qui a causa di google e ho risolto con l'ispirazione dalla risposta accettata, quindi volevo solo condividerla se qualcuno ha bisogno.


1

Sulla base della risposta @digitalbath, ecco una piccola funzione per catturare il timestamp UTC e visualizzare l'ora locale in un dato elemento DOM (usando jQuery per quest'ultima parte):

https://jsfiddle.net/moriz/6ktb4sv8/1/

<div id="eventTimestamp" class="timeStamp">
   </div>
   <script type="text/javascript">
   // Convert UTC timestamp to local time and display in specified DOM element
   function convertAndDisplayUTCtime(date,hour,minutes,elementID) {
    var eventDate = new Date(''+date+' '+hour+':'+minutes+':00 UTC');
    eventDate.toString();
    $('#'+elementID).html(eventDate);
   }
   convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');
   </script>

0

Ho scritto un piccolo script che prende un'epoca UTC e la converte nel fuso orario del sistema client e lo restituisce nel formato d / m / YH: i: s (come la funzione data PHP):

getTimezoneDate = function ( e ) {

    function p(s) { return (s < 10) ? '0' + s : s; }        

    var t = new Date(0);
    t.setUTCSeconds(e);

    var d = p(t.getDate()), 
        m = p(t.getMonth()+1), 
        Y = p(t.getFullYear()),
        H = p(t.getHours()), 
        i = p(t.getMinutes()), 
        s = p(t.getSeconds());

    d =  [d, m, Y].join('/') + ' ' + [H, i, s].join(':');

    return d;

};

0

Puoi usare momentjs , moment(date).format()darà sempre il risultato in data locale .

Bonus , puoi formattare nel modo che preferisci. Per es.

moment().format('MMMM Do YYYY, h:mm:ss a'); // September 14th 2018, 12:51:03 pm
moment().format('dddd');                    // Friday
moment().format("MMM Do YY"); 

Per maggiori dettagli è possibile consultare il sito Web Moment js


0

Puoi farlo usando il file moment.js .

È semplice, hai appena menzionato il luogo del fuso orario.

Esempio: se converti il ​​tuo datetime in fuso orario Asia / Calcutta, devi solo menzionare il nome del fuso orario ottenuto da moment.js

var UTCDateTime="Your date obtained from UTC";
var ISTleadTime=(moment.tz(UTCDateTime, "Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');


0

Ho creato una funzione che converte tutti i fusi orari in ora locale.

Non ho usato getTimezoneOffset (), perché non restituisce il valore di offset corretto

Requisiti:

1. npm i moment-timezone

function utcToLocal(utcdateTime, tz) {
    var zone = moment.tz(tz).format("Z") // Actual zone value e:g +5:30
    var zoneValue = zone.replace(/[^0-9: ]/g, "") // Zone value without + - chars
    var operator = zone && zone.split("") && zone.split("")[0] === "-" ? "-" : "+" // operator for addition subtraction
    var localDateTime
    var hours = zoneValue.split(":")[0]
    var minutes = zoneValue.split(":")[1]
    if (operator === "-") {
        localDateTime = moment(utcdateTime).subtract(hours, "hours").subtract(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else if (operator) {
        localDateTime = moment(utcdateTime).add(hours, "hours").add(minutes, "minutes").format("YYYY-MM-DD HH:mm:ss")
    } else {
        localDateTime = "Invalid Timezone Operator"
    }
    return localDateTime
}

utcToLocal("2019-11-14 07:15:37", "Asia/Kolkata")

//Returns "2019-11-14 12:45:37"

0

Nel mio caso, ho dovuto trovare la differenza di date in secondi. La data era una stringa di data UTC, quindi l'ho convertita in un oggetto data locale. Questo è quello che ho fatto:

let utc1 = new Date();
let utc2 = null;
const dateForCompare = new Date(valueFromServer);
dateForCompare.setTime(dateForCompare.getTime() - dateForCompare.getTimezoneOffset() * 
 60000);
utc2 = dateForCompare;

const seconds = Math.floor(utc1 - utc2) / 1000;

-1
function getUTC(str) {
    var arr = str.split(/[- :]/);
    var utc = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
    utc.setTime(utc.getTime() - utc.getTimezoneOffset()*60*1000)
    return utc;
}

Per gli altri che visitano - utilizzare questa funzione per ottenere un oggetto Date locale da una stringa UTC, dovrebbe occuparsi dell'ora legale e funzionerà su IE, IPhone ecc.

Dividiamo la stringa (poiché l'analisi di JS Date non è supportata su alcuni browser) Otteniamo la differenza dall'ora UTC e la sottraggiamo dall'ora UTC, che ci fornisce l'ora locale. Poiché l'offset restituito viene calcolato con l'ora legale (correggimi se sbaglio), quindi riporterà quel tempo nella variabile "utc". Infine restituisce l'oggetto data.


-1

In Angular ho usato la risposta di Ben in questo modo:

$scope.convert = function (thedate) {
    var tempstr = thedate.toString();
    var newstr = tempstr.toString().replace(/GMT.*/g, "");
    newstr = newstr + " UTC";
    return new Date(newstr);
};

Modifica: Angular 1.3.0 ha aggiunto il supporto UTC al filtro della data, non l'ho ancora usato ma dovrebbe essere più semplice, ecco il formato:

{{ date_expression | date : format : timezone}}

API angolare 1.4.3 Data

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.