Konvertieren Sie die UTC-Datums- und Uhrzeitangabe in die lokale Datums- und Uhrzeitangabe
336
Vom Server erhalte ich eine datetime-Variable in diesem Format: 6/29/2011 4:52:48 PMund sie ist in UTC-Zeit. Ich möchte es mit JavaScript in die Browserzeit des aktuellen Benutzers konvertieren.
Achtung. Das ist ein seltsames Datumsformat. Geben Sie es daher in der von Ihnen verwendeten Lösung an. Wenn möglich, lassen Sie den Server das Datum im ISO-Format senden.
Michael Scheper
Antworten:
402
Fügen Sie 'UTC' an die Zeichenfolge an, bevor Sie sie in ein Datum in Javascript konvertieren:
var date =newDate('6/29/2011 4:52:48 PM UTC');
date.toString()// "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Funktion localizeDateStr (date_to_convert_str) {var date_to_convert = neues Datum (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 offSet gibt Minuten zurück, nicht Stunden, Sie müssen durch 60 teilen
bladefist
50
Dies setzt voraus, dass der Datumsteil der Zeichenfolge dem US-Standard MM / TT / JJJJ entspricht, was in Europa und anderen Teilen der Welt offensichtlich nicht der Fall ist.
AsGoodAsItGets
7
@digitalbath Funktioniert unter Chrome, aber nicht unter Firefox.
In diesem Fall würde der Server zurückkehren, '2011-06-29T16:52:48.000Z'der direkt in das JS Date-Objekt eingespeist würde .
var utcDate ='2011-06-29T16:52:48.000Z';// ISO-8601 formatted date returned from servervar localDate =newDate(utcDate);
Das localDatewird in der richtigen Ortszeit sein, die in meinem Fall zwei Stunden später sein würde (DK-Zeit).
Sie müssen wirklich nicht all diese Analysen durchführen, was die Dinge nur kompliziert macht, solange Sie mit dem Format übereinstimmen, das Sie vom Server erwarten können.
Funktioniert nicht mit allen Zeitzonen. Es gibt einen guten Grund, warum getTimeZoneOffset in Minuten ist! geographylists.com/list20d.html
Siukurnin
5
@ Siukurnin. Um eine seltsame Zeitzone zu verwalten, verwenden Sie newDate.setTime (date.getTime () + date.getTimezoneOffset () * 60 * 1000)
Guillaume Gendre
18
newDate.setMinutes (date.getMinutes () - date.getTimezoneOffset ()) würde ausreichen. In
korrekten
1
Ziemlich sicher, dass dies unmöglich für eine Zeitzone funktionieren kann, die 30 Minuten entfernt ist? Es scheint sich auf ganze Stunden zu runden.
NickG
2
Dies scheint auch das Datum nicht richtig einzustellen, wenn die Zeitzonenverschiebung Mitternacht überschreitet. möglicherweise, weil nur setHours verwendet wird, was das Datum nicht beeinflusst?
Uniphonic
37
Sie sollten den (UTC) Offset (in Minuten) des Clients erhalten:
var offset =newDate().getTimezoneOffset();
Und dann addiert oder subtrahiert der Korrespondent die Zeit, die Sie vom Server erhalten.
Für mich haben die oben genannten Lösungen nicht funktioniert.
Mit IE ist die UTC-Konvertierung von Datum und Uhrzeit in lokal wenig schwierig. Für mich ist das Datum und die Uhrzeit der Web-API '2018-02-15T05:37:26.007'und ich wollte gemäß der lokalen Zeitzone konvertieren, daher habe ich den folgenden Code in JavaScript verwendet.
var createdDateTime =newDate('2018-02-15T05:37:26.007'+'Z');
Weniger Code zu verwenden new Date(+date + date.getTimezoneOffset() * 6e4). ;-)
RobG
es wird nicht funktionieren, meine Zeit in utc ist "2020-04-02T11: 09: 00", also habe ich es aus Singapur versucht, neues Datum (+ neues Datum ("2020-04-02T11: 09: 00") + neues Datum ( "2020-04-02T11: 09: 00"). GetTimezoneOffset () * 6e4), falsche Zeit angegeben
AhammadaliPK
dies funktionierte, neues Datum ("2020-04-02T11: 09: 00" + 'Z');
AhammadaliPK
10
Fügen Sie am Ende die Zeitzone hinzu, in diesem Fall 'UTC':
In Matts Antwort fehlt die Tatsache, dass die Sommerzeit zwischen Date () und der Datumszeit, die konvertiert werden muss, unterschiedlich sein kann - hier ist meine Lösung:
Verwenden Sie diese Option für die UTC- und Ortszeitkonvertierung und umgekehrt.
//Covert datetime by GMT offset //If toUTC is true then return UTC time other wise return local timefunction convertLocalDateToUTCDate(date, toUTC){
date =newDate(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 =newDate(date);
console.log("Converted time: "+ date);return date;}
Hat jemand irgendwelche Probleme damit? Dies scheint mir die beste Option zu sein. Ich habe eine UTC-Zeichenfolge mit "(UTC)" am Ende genommen, sie mit einem Datumsobjekt eingerichtet new Date('date string')und dann diese beiden Zeilen hinzugefügt, und sie scheint mit einer Zeit zurückzukehren, die vollständig vom UTC-Zeitstempel des Servers abhängt mit Anpassungen, die vorgenommen wurden, um sie an die Ortszeit des Benutzers anzupassen. Ich muss mir auch Sorgen um die seltsamen Zeitzonen von Bruchteilen einer Stunde machen ... Ich bin mir nicht sicher, ob es die ganze Zeit perfekt hält ...
Tyler
versuchte viele andere Optionen, keine von ihnen funktionierte, aber das funktioniert
Sameera K
5
Eine JSON-Datumszeichenfolge (in C # serialisiert) sieht aus wie "2015-10-13T18: 58: 17".
Im Winkel (nach Hulvej) machen Sie einen localdateFilter:
myFilters.filter('localdate',function(){returnfunction(input){var date =newDate(input +'.000Z');return date;};})
Zeigen Sie dann die Ortszeit wie folgt an:
{{order.createDate | localdate | date :'MMM d, y h:mm a'}}
var date =newDate('2011-06-29T16:52:48+00:00');
date.toString()// "Wed Jun 29 2011 09:52:48 GMT-0700 (PDT)"
Stellen Sie beim Konvertieren aus dem YYYY-MM-DD hh:mm:ssFormat sicher, dass Ihr Datum dem ISO 8601-Format entspricht .
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)
Wichtige Dinge zu beachten
Sie müssen Datum und Uhrzeit durch a trennen. TIn einigen Browsern funktioniert ein Leerzeichen nicht
Sie müssen die Zeitzone in diesem Format einstellen. Die +hh:mmVerwendung einer Zeichenfolge für eine Zeitzone (Beispiel: 'UTC') funktioniert in vielen Browsern nicht. +hh:mmstellen den Versatz von der UTC-Zeitzone dar.
@Adorojan'sAntwort ist fast richtig. Das Hinzufügen des Versatzes ist jedoch nicht korrekt, da der Versatzwert negativ ist, wenn das Browserdatum vor GMT liegt und umgekehrt. Nachfolgend finden Sie die Lösung, mit der ich gekommen bin und die für mich einwandfrei funktioniert:
// Input time in UTCvar inputInUtc ="6/29/2011 4:52:48";var dateInUtc =newDate(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 timezonereturnnewDate(dateInUtc.getTime()- dateInUtc.getTimezoneOffset()*60*1000);}
Ich beantworte dies, wenn jemand eine Funktion möchte, die die konvertierte Zeit in ein bestimmtes ID-Element anzeigt und die Datumsformatzeichenfolge JJJJ-MM-TT anwendet. Hier ist Datum1 Zeichenfolge und IDs ist die ID des Elements, das zu dieser Zeit angezeigt wird.
Ich weiß, dass die Antwort bereits akzeptiert wurde, aber ich komme wegen Google hierher und habe sie gelöst, indem ich mich von der akzeptierten Antwort inspirieren ließ, also wollte ich sie nur teilen, wenn jemand sie braucht.
Basierend auf der Antwort von @digitalbath gibt es hier eine kleine Funktion zum Abrufen des UTC-Zeitstempels und zum Anzeigen der Ortszeit in einem bestimmten DOM-Element (unter Verwendung von jQuery für diesen letzten Teil):
<div id="eventTimestamp"class="timeStamp"></div><script type="text/javascript">// Convert UTC timestamp to local time and display in specified DOM elementfunction convertAndDisplayUTCtime(date,hour,minutes,elementID){var eventDate =newDate(''+date+' '+hour+':'+minutes+':00 UTC');
eventDate.toString();
$('#'+elementID).html(eventDate);}
convertAndDisplayUTCtime('06/03/2015',16,32,'eventTimestamp');</script>
Ich habe ein nettes kleines Skript geschrieben, das eine UTC-Epoche nimmt und es in die Zeitzone des Client-Systems konvertiert und im Format d / m / YH: i: s (wie die PHP-Datumsfunktion) zurückgibt:
getTimezoneDate =function( e ){function p(s){return(s <10)?'0'+ s : s;}var t =newDate(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;};
Es ist einfach, Sie haben gerade den Ort der Zeitzone erwähnt.
Beispiel: Wenn Sie Ihre Datums- und Uhrzeitangabe in die Zeitzone Asien / Kolkata konvertieren möchten, müssen Sie nur den Namen des Zeitzonenorts angeben , der aus moment.js erhalten wurde
varUTCDateTime="Your date obtained from UTC";varISTleadTime=(moment.tz(UTCDateTime,"Africa/Abidjan")).tz("Asia/Kolkata").format('YYYY-MM-DD LT');
Ich habe eine Funktion erstellt, die alle Zeitzonen in Ortszeit konvertiert.
Ich habe getTimezoneOffset () nicht verwendet, da kein korrekter Offsetwert zurückgegeben wird
Bedarf:
1. npm i moment-timezone
function utcToLocal(utcdateTime, tz){var zone = moment.tz(tz).format("Z")// Actual zone value e:g +5:30var zoneValue = zone.replace(/[^0-9: ]/g,"")// Zone value without + - charsvaroperator= zone && zone.split("")&& zone.split("")[0]==="-"?"-":"+"// operator for addition subtractionvar 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")}elseif(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"
In meinem Fall musste ich die Datumsdifferenz in Sekunden ermitteln. Das Datum war eine UTC-Datumszeichenfolge, daher habe ich es in ein lokales Datumsobjekt konvertiert. Das habe ich getan:
function getUTC(str){var arr = str.split(/[- :]/);var utc =newDate(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);
utc.setTime(utc.getTime()- utc.getTimezoneOffset()*60*1000)return utc;}
Für andere Besucher - Verwenden Sie diese Funktion, um ein lokales Datumsobjekt aus einer UTC-Zeichenfolge abzurufen. Sie sollten sich um die Sommerzeit kümmern und funktionieren mit IE, IPhone usw.
Wir teilen die Zeichenfolge (da die JS-Datumsanalyse in einigen Browsern nicht unterstützt wird). Wir erhalten einen Unterschied zur UTC und subtrahieren ihn von der UTC-Zeit, die uns die Ortszeit gibt. Da der zurückgegebene Offset mit der Sommerzeit berechnet wird (korrigieren Sie mich, wenn ich falsch liege), wird diese Zeit in der Variablen "utc" zurückgesetzt. Geben Sie schließlich das Datumsobjekt zurück.
Bearbeiten: Angular 1.3.0 hat dem Datumsfilter UTC-Unterstützung hinzugefügt. Ich habe es noch nicht verwendet, aber es sollte einfacher sein. Hier ist das Format:
Antworten:
Fügen Sie 'UTC' an die Zeichenfolge an, bevor Sie sie in ein Datum in Javascript konvertieren:
quelle
!
Vorsicht!
_ … das Parsen von Datumszeichenfolgen mit dem Date-Konstruktor (und Date.parse, sie sind gleichwertig) wird aufgrund von Browserunterschieden und InkonsistenzenAus meiner Sicht sollten Server im Allgemeinen immer eine Datums- / Uhrzeitangabe im standardisierten ISO 8601-Format zurückgeben .
Mehr Infos hier:
In diesem Fall würde der Server zurückkehren,
'2011-06-29T16:52:48.000Z'
der direkt in das JS Date-Objekt eingespeist würde .Das
localDate
wird in der richtigen Ortszeit sein, die in meinem Fall zwei Stunden später sein würde (DK-Zeit).Sie müssen wirklich nicht all diese Analysen durchführen, was die Dinge nur kompliziert macht, solange Sie mit dem Format übereinstimmen, das Sie vom Server erwarten können.
quelle
DateTime
Objekt.toString("o")
formatieren, mit dem eine ISO-8601-formatierte Zeichenfolge wie oben gezeigt zurückgegeben wird. msdn.microsoft.com/en-us/library/zdtaw1bw(v=vs.110).aspx In Javascript ist esnew Date().toISOString()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Dies ist eine universelle Lösung:
Verwendungszweck:
Zeigen Sie das Datum basierend auf der lokalen Clienteinstellung an:
quelle
Sie sollten den (UTC) Offset (in Minuten) des Clients erhalten:
Und dann addiert oder subtrahiert der Korrespondent die Zeit, die Sie vom Server erhalten.
Hoffe das hilft.
quelle
Für mich haben die oben genannten Lösungen nicht funktioniert.
Mit IE ist die UTC-Konvertierung von Datum und Uhrzeit in lokal wenig schwierig. Für mich ist das Datum und die Uhrzeit der Web-API
'2018-02-15T05:37:26.007'
und ich wollte gemäß der lokalen Zeitzone konvertieren, daher habe ich den folgenden Code in JavaScript verwendet.quelle
Setzen Sie diese Funktion in Ihren Kopf:
Generieren Sie dann für jedes Datum im Hauptteil Ihrer Seite Folgendes:
Ändern Sie die folgende Zeile, um die GMT und die Zeitzone zu entfernen:
quelle
Das funktioniert bei mir:
quelle
Nachdem ich einige andere hier ohne gute Ergebnisse ausprobiert hatte, schien dies für mich zu funktionieren:
Und dies funktioniert in umgekehrter Richtung, vom lokalen Datum bis zur UTC:
quelle
new Date(+date + date.getTimezoneOffset() * 6e4)
. ;-)Fügen Sie am Ende die Zeitzone hinzu, in diesem Fall 'UTC':
Verwenden Sie danach die Funktionsfamilien toLocale () * , um das Datum im richtigen Gebietsschema anzuzeigen
quelle
In Matts Antwort fehlt die Tatsache, dass die Sommerzeit zwischen Date () und der Datumszeit, die konvertiert werden muss, unterschiedlich sein kann - hier ist meine Lösung:
Und die Ergebnisse im Debugger:
quelle
Verwenden Sie diese Option für die UTC- und Ortszeitkonvertierung und umgekehrt.
quelle
Dies ist eine vereinfachte Lösung, die auf der Antwort von Adorjan Princ basiert:
Verwendungszweck:
quelle
Wenn Sie nichts dagegen haben
moment.js
und Ihre Zeit in UTC ist, verwenden Sie einfach Folgendes:Wenn Ihre Zeit nicht in utc, sondern in einem anderen Ihnen bekannten Gebietsschema angegeben ist, verwenden Sie Folgendes:
Wenn Ihre Zeit bereits lokal ist, verwenden Sie Folgendes:
quelle
Für mich schien das einfachste zu verwenden
(Ich dachte, die erste Zeile könnte ausreichen, aber es gibt Zeitzonen, die in Bruchteilen von Stunden ausgeschaltet sind.)
quelle
new Date('date string')
und dann diese beiden Zeilen hinzugefügt, und sie scheint mit einer Zeit zurückzukehren, die vollständig vom UTC-Zeitstempel des Servers abhängt mit Anpassungen, die vorgenommen wurden, um sie an die Ortszeit des Benutzers anzupassen. Ich muss mir auch Sorgen um die seltsamen Zeitzonen von Bruchteilen einer Stunde machen ... Ich bin mir nicht sicher, ob es die ganze Zeit perfekt hält ...Eine JSON-Datumszeichenfolge (in C # serialisiert) sieht aus wie "2015-10-13T18: 58: 17".
Im Winkel (nach Hulvej) machen Sie einen
localdate
Filter:Zeigen Sie dann die Ortszeit wie folgt an:
quelle
Mit
YYYY-MM-DD hh:mm:ss
Format:Stellen Sie beim Konvertieren aus dem
YYYY-MM-DD hh:mm:ss
Format sicher, dass Ihr Datum dem ISO 8601-Format entspricht .Wichtige Dinge zu beachten
T
In einigen Browsern funktioniert ein Leerzeichen nicht+hh:mm
Verwendung einer Zeichenfolge für eine Zeitzone (Beispiel: 'UTC') funktioniert in vielen Browsern nicht.+hh:mm
stellen den Versatz von der UTC-Zeitzone dar.quelle
@Adorojan's
Antwort ist fast richtig. Das Hinzufügen des Versatzes ist jedoch nicht korrekt, da der Versatzwert negativ ist, wenn das Browserdatum vor GMT liegt und umgekehrt. Nachfolgend finden Sie die Lösung, mit der ich gekommen bin und die für mich einwandfrei funktioniert:quelle
Für mich funktioniert das gut
quelle
Ich beantworte dies, wenn jemand eine Funktion möchte, die die konvertierte Zeit in ein bestimmtes ID-Element anzeigt und die Datumsformatzeichenfolge JJJJ-MM-TT anwendet. Hier ist Datum1 Zeichenfolge und IDs ist die ID des Elements, das zu dieser Zeit angezeigt wird.
Ich weiß, dass die Antwort bereits akzeptiert wurde, aber ich komme wegen Google hierher und habe sie gelöst, indem ich mich von der akzeptierten Antwort inspirieren ließ, also wollte ich sie nur teilen, wenn jemand sie braucht.
quelle
Basierend auf der Antwort von @digitalbath gibt es hier eine kleine Funktion zum Abrufen des UTC-Zeitstempels und zum Anzeigen der Ortszeit in einem bestimmten DOM-Element (unter Verwendung von jQuery für diesen letzten Teil):
https://jsfiddle.net/moriz/6ktb4sv8/1/
quelle
Ich habe ein nettes kleines Skript geschrieben, das eine UTC-Epoche nimmt und es in die Zeitzone des Client-Systems konvertiert und im Format d / m / YH: i: s (wie die PHP-Datumsfunktion) zurückgibt:
quelle
Sie können momentjs verwenden ,
moment(date).format()
das Ergebnis wird immer im lokalen Datum angegeben .Bonus , Sie können nach Belieben formatieren. Zum Beispiel.
Weitere Informationen finden Sie auf der Website von Moment js
quelle
Sie können dies mit der Datei moment.js erledigen .
Es ist einfach, Sie haben gerade den Ort der Zeitzone erwähnt.
Beispiel: Wenn Sie Ihre Datums- und Uhrzeitangabe in die Zeitzone Asien / Kolkata konvertieren möchten, müssen Sie nur den Namen des Zeitzonenorts angeben , der aus moment.js erhalten wurde
quelle
Ich habe eine Funktion erstellt, die alle Zeitzonen in Ortszeit konvertiert.
Ich habe getTimezoneOffset () nicht verwendet, da kein korrekter Offsetwert zurückgegeben wird
Bedarf:
quelle
In meinem Fall musste ich die Datumsdifferenz in Sekunden ermitteln. Das Datum war eine UTC-Datumszeichenfolge, daher habe ich es in ein lokales Datumsobjekt konvertiert. Das habe ich getan:
quelle
Für andere Besucher - Verwenden Sie diese Funktion, um ein lokales Datumsobjekt aus einer UTC-Zeichenfolge abzurufen. Sie sollten sich um die Sommerzeit kümmern und funktionieren mit IE, IPhone usw.
Wir teilen die Zeichenfolge (da die JS-Datumsanalyse in einigen Browsern nicht unterstützt wird). Wir erhalten einen Unterschied zur UTC und subtrahieren ihn von der UTC-Zeit, die uns die Ortszeit gibt. Da der zurückgegebene Offset mit der Sommerzeit berechnet wird (korrigieren Sie mich, wenn ich falsch liege), wird diese Zeit in der Variablen "utc" zurückgesetzt. Geben Sie schließlich das Datumsobjekt zurück.
quelle
In Angular habe ich Bens Antwort folgendermaßen verwendet:
Bearbeiten: Angular 1.3.0 hat dem Datumsfilter UTC-Unterstützung hinzugefügt. Ich habe es noch nicht verwendet, aber es sollte einfacher sein. Hier ist das Format:
Angular 1.4.3 Date API
quelle