Chuyển đổi ngày sang UTC bằng moment.js


95

Câu trả lời có thể và dễ dàng cho điều này nhưng dường như tôi không thể tìm ra cách để lấy moment.js trả về ngày giờ UTC tính bằng mili giây. Đây là những gì tôi đang làm:

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

Bất kỳ ý tưởng những gì tôi đang làm sai?

Câu trả lời:


101

Điều này được tìm thấy trong tài liệu . Với một thư viện như khoảnh khắc, tôi mong bạn đọc toàn bộ tài liệu. Nó thực sự quan trọng.

Giả sử văn bản đầu vào được nhập theo giờ địa phương của người dùng:

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

Nếu người dùng được hướng dẫn thực sự nhập ngày / giờ UTC, thì:

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

22
Đã chỉnh sửa - gỡ bỏ "dễ dàng". :)
Matt Johnson-Pint

6
Và nếu tôi đã có ngày-giờ thời điểm với múi giờ, làm cách nào để chuyển đổi nó sang UTC?
ア レ ッ ク ス

@Alexander -.utc()
Matt Johnson-Pint

2
Điều đó không hiệu quả. Điều đó chỉ thay đổi các phương pháp được sử dụng vào ngày chứ không phải chính ngày.
Colleen

2
@Colleen - có, nhưng sau đó người ta thường gọi một trong những phương thức đó, chẳng hạn như phương thức .format()này sẽ phát ra giá trị UTC. Nó không thể tự thay đổi giá trị ngày nội bộ vì a Dateđã theo dõi dấu thời gian UTC. Nó luôn luôn chỉ là các phương thức được gọi trên nó để xác định xem nên phát ra UTC hay giờ địa phương. Moment là như nhau về mặt đó.
Matt Johnson-Pint

53

Tôi sử dụng phương pháp này và nó hoạt động. ValueOf không hoạt động đối với tôi.

moment.utc(yourDate).format()

2
Điều này hoạt động theo tài liệu. chuyển đổi giờ địa phương sang UTC.
Kishor Pawar

1
Có cái gì đó tanh ở đây. Tôi đang sử dụng phiên bản moment.js. 2.17.1 và nếu 'yourdate' là '2017-10-14T21: 00: 00Z' (vi-chúng tôi) thì đoạn mã trên trả về cùng một kết quả '2017-10-14T21: 00: 00Z', rõ ràng là không phải utc vì tôi ở gmt + 3. Kết quả đúng sẽ là '2017-10-15T00: 00: 00 + 03: 00' và bạn nhận được kết quả này thông qua 'moment (yourDate) .format ()'.
XDS

14

Kể từ: moment.js version 2.24.0

giả sử bạn có đầu vào ngày cục bộ, đây là cách thích hợp để chuyển đổi đầu vào dateTime hoặc Time của bạn thành UTC :

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

hoặc trong trường hợp bạn chỉ định một ngày

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

Như bạn có thể thấy, kết quả đầu ra sẽ được trả về theo giờ UTC:

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

Nhưng nếu bạn làm điều này như bên dưới, nó sẽ không chuyển đổi thành UTC:

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

Bạn chỉ đặt đầu vào của mình thành thời gian utc, giống như thể bạn đang đề cập rằng myTime ở UTC, .... đầu ra sẽ là 9:00


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

là con đường để đi, vì

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

cư xử kỳ lạ ...


1
Bạn có thể vui lòng giải thích hành vi kỳ lạ của moment().utc(date).format(...)?
Freeman Lambda

2
Các hành vi không phải là kỳ lạ, đó là những phương pháp khác nhau. Đầu tiên moment.utc(date)là dành cho phân tích các date. Thứ hai moment().utc(date)là để thao tác thời gian hiện tại ( moment()) và datetham số là vô dụng vì điều này .utc()trong trường hợp này không mong đợi bất kỳ tham số nào.
CodingHamster

2

Điều này đã làm việc cho tôi. Những người khác có thể thấy nó hữu ích.

// date = 2020-08-31T00: 00: 00Z Tôi sống ở Đan Mạch (múi giờ là +2 giờ)

moment.utc (moment (date) .utc ()). format () // trả về 2020-08-30T22: 00: 00Z


1

Nếu vẫn thất bại, chỉ cần bắt đầu lại với một nghịch đảo của bù đắp cục bộ của bạn.

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

timestamp.toISOString(); // This should give you the accurate UTC equivalent.

Điều này không hoạt động. Những gì hiện công việc là thiết lập các keepOffsettham số là true, như trong moment(timestamp).toISOString(true),
Chris Haines

1

ở đây, tôi đang chuyển đối tượng ngày tháng và chuyển đổi nó thành giờ 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);

1

Đây sẽ là câu trả lời:

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

0

Đọc tài liệu này của moment.js tại đây . Xem ví dụ và kết quả dưới đây trong đó tôi chuyển đổi giờ GMT thành giờ địa phương (khu vực của tôi là IST) và sau đó tôi chuyển đổi giờ địa phương thành 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)

Đầu ra là

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

-1

Bạn không cần một cái gì đó để so sánh và sau đó truy xuất mili giây?

Ví dụ:

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

Cùng với đó, bạn có ngày hết hạn theo UTC. Bây giờ bạn có thể lấy ngày "ngay bây giờ" theo UTC và so sánh:

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();

Các moment.valueOf()(new Date()).getTime()cả sự trở lại mili giây kể từ 01 Tháng Một 1970 UTC (đó là một tiêu chuẩn)
Drenai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.