Konwertuj datę na UTC za pomocą momentu.js.

97

Prawdopodobnie i łatwa odpowiedź na to pytanie, ale nie mogę znaleźć sposobu, aby moment.js zwracał datę UTC w milisekundach. Oto co robię:

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

Masz pojęcie, co robię źle?

user1956816
źródło

Odpowiedzi:

103

Można to znaleźć w dokumentacji . Z chwilą jak w bibliotece zachęcam do przeczytania całej dokumentacji. To naprawdę ważne.

Zakładając, że tekst wejściowy jest wprowadzany w oparciu o czas lokalny użytkownika:

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

Jeśli użytkownik zostanie poinstruowany, aby wprowadzić datę / godzinę UTC, wówczas:

 var expires = moment.utc(date).valueOf();
Matt Johnson-Pint
źródło
23
Edytowano - usunięto „łatwo”. :)
Matt Johnson-Pint
6
A jeśli mam już moment daty i godziny ze strefą czasową, jak mogę przekonwertować go na UTC?
ア レ ッ ク ス
@Alexander -.utc()
Matt Johnson-Pint
2
To nie działa. To zmienia tylko metody stosowane w dacie, a nie samą datę.
Colleen
2
@Colleen - tak, ale zwykle można by wtedy wywołać jedną z tych metod, na przykład .format(), która wyemituje wartość UTC. Nie może zmienić samej wewnętrznej wartości daty, ponieważ Dateśledzi już znacznik czasu UTC. To zawsze tylko wywoływane metody określają, czy emitować czas UTC, czy czas lokalny. Pod tym względem moment jest taki sam.
Matt Johnson-Pint
57

Używam tej metody i działa. ValueOf nie działa dla mnie.

moment.utc(yourDate).format()
Bruno Quaresma
źródło
3
Działa to zgodnie z dokumentacją. konwertuje czas lokalny na UTC.
Kishor Pawar
1
Jest tu coś podejrzanego. Używam momentu.js wer. 2.17.1 i jeśli „twoja data” to „2017-10-14T21: 00: 00Z” (en-us), powyższy fragment kodu zwraca dokładnie ten sam wynik „2017-10-14T21: 00: 00Z”, co oczywiście nie jest utc, ponieważ jestem w gmt + 3. Prawidłowy wynik to „2017-10-15T00: 00: 00 + 03: 00”, a otrzymasz to za pomocą „moment (twojaData) .format ()”.
XDS
14

Od: moment.js version 2.24.0

powiedzmy, że masz lokalne wejście daty, jest to właściwy sposób konwersji danych wejściowych DateTime lub Time na UTC :

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

lub w przypadku, gdy określisz datę

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

Jak widać, wynik zostanie zwrócony w UTC:

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

Ale jeśli zrobisz to jak poniżej, nie zostanie przekonwertowany na UTC:

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

Ustawiasz tylko wejście na czas utc, to tak, jakbyś wspominał, że myTime jest w UTC, ... wyjście będzie 9:00

napi15
źródło
3
moment.utc(date).format(...); 

jest drogą do zrobienia, ponieważ

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

zachowuje się dziwnie ...

Florian S.
źródło
1
Czy mógłbyś opisać dziwne zachowanie moment().utc(date).format(...)?
Freeman Lambda
2
Zachowanie nie jest dziwne, to są różne metody. Pierwszy moment.utc(date)jest dla parsowaniadate . Drugi moment().utc(date)służy do manipulowania bieżącym czasem ( moment()), a dateparametr jest bezużyteczny, ponieważ .utc()w tym przypadku nie oczekuje się żadnych parametrów.
CodingHamster
3

To będzie odpowiedź:

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
źródło
2

To zadziałało dla mnie. Inni mogą uznać to za przydatne.

// date = 2020-08-31T00: 00: 00Z Mieszkam w Danii (strefa czasowa to +2 godziny)

moment.utc(moment(date).utc()).format() // zwraca 2020-08-30T22: 00: 00Z

Mikael
źródło
1

Jeśli wszystko inne zawiedzie, po prostu przeprowadź ponowną inicjalizację z odwrotnością lokalnego offsetu.

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
źródło
1
To nie działa. To, co działa, to ustawienie keepOffsetparametru na true, tak jak w moment(timestamp).toISOString(true),
Chris Haines,
1

tutaj przekazuję obiekt daty i konwertuję go na czas UTC.

$.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);
Niezwyciężony
źródło
1

To moment.utc(stringDate, format).toDate() zadziałało dla mnie.

To moment.utc(date).toDate()nie.

Hizabr
źródło
0

Przeczytaj dokumentację moment.js tutaj . Zobacz poniższy przykład i dane wyjściowe, w których konwertuję czas GMT na czas lokalny (moja strefa to IST), a następnie konwertuję czas lokalny na GMT.

// 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)

Wyjście jest

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
źródło
-1

Czy nie potrzebujesz czegoś do porównania, a następnie odzyskania milisekund?

Na przykład:

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

Dzięki temu masz datę ważności w UTC. Teraz możesz uzyskać datę „teraz” w UTC i porównać:

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
źródło
Te moment.valueOf()i (new Date()).getTime()zwracają milisekundy od 1 stycznia 1970 UTC (jest to standard)
Drenajów