Dal server ottengo una variabile datetime in questo formato: 6/29/2011 4:52:48 PM
ed è in ora UTC. Voglio convertirlo al tempo del browser dell'utente corrente utilizzando JavaScript.
Come è possibile farlo utilizzando JavaScript o jQuery?
Dal server ottengo una variabile datetime in questo formato: 6/29/2011 4:52:48 PM
ed è in ora UTC. Voglio convertirlo al tempo del browser dell'utente corrente utilizzando JavaScript.
Come è possibile farlo utilizzando JavaScript o jQuery?
Risposte:
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)"
!
Attenzione !
_ ... l'analisi delle stringhe di date con il costruttore Date (e Date.parse, sono equivalenti) è fortemente scoraggiata a causa delle differenze del browser e delle incoerenze ... (che probabilmente era ancora più vero nel 2011)
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 localDate
sarà 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.
DateTime
oggetto 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/…
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();
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');
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,""));
Questo funziona per me:
function convertUTCDateToLocalDate(date) {
var newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
return newDate;
}
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());
}
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)
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"
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)
//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;
}
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));
Nel caso in cui non ti dispiaccia usare moment.js
e 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');
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)
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
Una stringa di date JSON (serializzata in C #) sembra "2015-10-13T18: 58: 17".
In angolare, (seguendo Hulvej) crea un localdate
filtro:
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' }}
Utilizzando il YYYY-MM-DD hh:mm:ss
formato:
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:ss
formato, 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
T
, uno spazio non funzionerà in alcuni browser+hh:mm
, usando una stringa per un fuso orario (es. 'UTC') non funzionerà in molti browser. +hh:mm
rappresenta l'offset dal fuso orario UTC.@Adorojan's
la 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);
}
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.
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>
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;
};
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
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');
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"
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;
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.
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}}