Konvertieren Sie das Datum mit moment.js in UTC

91

Wahrscheinlich und einfache Antwort darauf, aber ich kann anscheinend keinen Weg finden, moment.js dazu zu bringen, eine UTC-Datums- und Uhrzeit in Millisekunden zurückzugeben. Folgendes mache ich:

var date = $("#txt-date").val(),
    expires = moment.utc(date);

Irgendeine Idee, was ich falsch mache?

user1956816
quelle

Antworten:

96

Dies finden Sie in der Dokumentation . In einem Moment wie in einer Bibliothek fordere ich Sie dringend auf, die gesamte Dokumentation zu lesen. Es ist wirklich wichtig.

Angenommen, der eingegebene Text wird in Bezug auf die Ortszeit des Benutzers eingegeben:

 var expires = moment(date).valueOf();

Wenn der Benutzer angewiesen wird, tatsächlich ein UTC-Datum / eine UTC-Uhrzeit einzugeben, gilt Folgendes:

 var expires = moment.utc(date).valueOf();
Matt Johnson-Pint
quelle
21
Bearbeitet - "leicht" entfernt. :)
Matt Johnson-Pint
6
Und wenn ich bereits einen Moment mit einer Zeitzone habe, wie kann ich ihn in UTC konvertieren?
レ ッ ク ス
@ Alexander -.utc()
Matt Johnson-Pint
2
Das geht nicht Dadurch werden nur die am Datum verwendeten Methoden geändert, nicht das Datum selbst.
Colleen
2
@Colleen - ja, aber normalerweise ruft man dann eine dieser Methoden auf, z. B. .format()die den UTC-Wert ausgibt . Es kann nicht das interne Datum Wert selbst ändern, weil ein Datebereits einen UTC - Zeitstempel - Tracking. Es sind immer nur die aufgerufenen Methoden, die bestimmen, ob UTC oder Ortszeit ausgegeben werden sollen. Der Moment ist in dieser Hinsicht der gleiche.
Matt Johnson-Pint
51

Ich benutze diese Methode und es funktioniert. ValueOf funktioniert bei mir nicht.

moment.utc(yourDate).format()
Bruno Quaresma
quelle
2
Dies funktioniert gemäß Dokumentation. konvertiert die Ortszeit in UTC.
Kishor Pawar
1
Hier ist etwas faul. Ich benutze moment.js ver. 2.17.1 und wenn 'yourdate' auf '2017-10-14T21: 00: 00Z' (en-us) lautet, gibt das obige Snippet genau das gleiche Ergebnis '2017-10-14T21: 00: 00Z' zurück, was offensichtlich nicht der Fall ist utc da ich in gmt + 3 bin. Das korrekte Ergebnis wäre '2017-10-15T00: 00: 00 + 03: 00' und Sie erhalten dies über 'moment (yourDate) .format ()'.
XDS
12

Ab: moment.js version 2.24.0

Angenommen , Sie haben eine lokale Datumseingabe. Dies ist die richtige Methode , um Ihre dateTime- oder Time- Eingabe in zu konvertieren UTC :

var utcStart = new moment("09:00", "HH:mm").utc();

oder falls Sie ein Datum angeben

var utcStart = new moment("2019-06-24T09:00", "YYYY-MM-DDTHH:mm").utc();

Wie Sie sehen können, wird die Ergebnisausgabe in UTC zurückgegeben:

//You can call the format() that will return your UTC date in a string 
 utcStart.format(); 
//Result : 2019-06-24T13:00:00 

Aber wenn Sie dies wie unten tun, ist es folgt nicht in UTC konvertiert:

var myTime = new moment.utc("09:00", "HH:mm"); 

Sie stellen Ihre Eingabe nur auf utc time ein. Es ist, als würden Sie erwähnen, dass myTime in UTC ist. Die Ausgabe erfolgt um 9:00 Uhr

napi15
quelle
3
moment.utc(date).format(...); 

ist der Weg zu gehen, da

moment().utc(date).format(...);

verhält sich komisch ...

Florian S.
quelle
1
Könnten Sie bitte das seltsame Verhalten von näher erläutern moment().utc(date).format(...)?
Freeman Lambda
2
Das Verhalten ist nicht komisch, das sind verschiedene Methoden. Der erste moment.utc(date)dient zum Parsen des date. Die zweite moment().utc(date)dient zum Manipulieren der aktuellen Zeit ( moment()) und der dateParameter ist nutzlos, da .utc()in diesem Fall keine Parameter erwartet werden.
CodingHamster
1

Wenn alles andere fehlschlägt, initialisieren Sie einfach mit einer Umkehrung Ihres lokalen Offsets neu.

var timestamp = new Date();
var inverseOffset = moment(timestamp).utcOffset() * -1;
timestamp = moment().utcOffset( inverseOffset  );

timestamp.toISOString(); // This should give you the accurate UTC equivalent.
Timothy Perez
quelle
Das funktioniert nicht. Was funktioniert, ist das Setzen des keepOffsetParameters auf true, wie in moment(timestamp).toISOString(true),
Chris Haines
1

Hier übergebe ich das Datumsobjekt und konvertiere es in UTC-Zeit.

$.fn.convertTimeToUTC = function (convertTime) {
   if($(this).isObject(convertTime)) {
        return moment.tz(convertTime.format("Y-MM-DD HH:mm:ss"), moment.tz.guess()).utc().format("Y-MM-DD HH:mm:ss");
    }
};
// Returns if a value is an object
$.fn.isObject =  function(value) {
    return value && typeof value === 'object';
};


//you can call it as below
$(this).convertTimeToUTC(date);
Unbesiegbar
quelle
1

Dies wird die Antwort sein:

moment.utc(moment(localdate)).format()
localdate = '2020-01-01 12:00:00'

moment(localdate)
//Moment<2020-01-01T12:00:00+08:00>

moment.utc(moment(localdate)).format()
//2020-01-01T04:00:00Z
soohan
quelle
0

Lesen Sie diese Dokumentation von moment.js hier . Siehe Beispiel und Ausgabe, in der ich die GMT-Zeit in die Ortszeit konvertiere (meine Zone ist IST) und dann die Ortszeit in GMT konvertiere.

// convert GMT to local time
console.log('Server time:' + data[i].locationServerTime)
let serv_utc = moment.utc(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment(serv_utc,"YYYY-MM-DD HH:mm:ss").tz(self.zone_name).format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to local time:' + data[i].locationServerTime)

// convert local time to GMT
console.log('local time:' + data[i].locationServerTime)
let serv_utc = moment(data[i].locationServerTime, "YYYY-MM-DD HH:mm:ss").toDate();
console.log('serv_utc:' + serv_utc)
data[i].locationServerTime = moment.utc(serv_utc,"YYYY-MM-DD HH:mm:ss").format("YYYY-MM-DD HH:mm:ss");
console.log('Converted to server time:' + data[i].locationServerTime)

Ausgabe ist

Server time:2019-12-19 09:28:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to local time:2019-12-19 14:58:13
local time:2019-12-19 14:58:13
serv_utc:Thu Dec 19 2019 14:58:13 GMT+0530 (India Standard Time)
Converted to server time:2019-12-19 09:28:13
Dineshydv
quelle
-1

Benötigen Sie nichts zum Vergleichen und Abrufen der Millisekunden?

Zum Beispiel:

let enteredDate = $("#txt-date").val(); // get the date entered in the input
let expires = moment.utc(enteredDate); // convert it into UTC

Damit haben Sie das Ablaufdatum in UTC. Jetzt können Sie das "Sofort" -Datum in UTC abrufen und vergleichen:

var rightNowUTC = moment.utc(); // get this moment in UTC based on browser
let duration = moment.duration(rightNowUTC.diff(expires)); // get the diff
let remainingTimeInMls = duration.asMilliseconds();
theRonny
quelle
Die moment.valueOf()und (new Date()).getTime()beide geben die Millisekunden seit dem 1. Januar 1970 UTC zurück (es ist ein Standard)
Drenai