2014-11-11 12 views
18

Tôi không thể nhận chuỗi Ngày tháng JavaScript cho bản ghi MongoDB qua các bước sau. Nó tiếp tục sử dụng thời gian địa phương của tôi.MomentJS nhận JavaScript Ngày ở UTC

var utc = moment.utc().valueOf(); 
console.log(moment.utc(utc).toDate()); 

Output:

Tue Nov 11 2014 14:42:51 GMT-0500 (EST) 

Tôi cần nó để được ở UTC, vì vậy tôi có thể dính dấu thời gian này ở Mông Cổ để loại sẽ Date.

Tôi có thể làm như thế nào?

+0

Điều gì sẽ xảy ra khi bạn lưu trữ đối tượng ngày như vậy? –

+0

nó được lưu trữ dưới dạng gấp đôi, không phải là đối tượng Kiểu ngày. Tôi cần nó là toDate() của utc. có một thời gian khủng khiếp với điều này. cảm ơn vì sự giúp đỡ! – Cmag

+0

Tôi hỏi lại, điều gì sẽ xảy ra khi bạn lưu trữ. Nó có tải ngày không chính xác không? Nó có phá vỡ trong các múi giờ khác nhau không? –

Trả lời

41

Dấu thời gian là thời điểm. Thông thường, điều này có thể được biểu diễn bằng một số mili giây qua một epoc (Unix Epoc của Jan 1 1970 12AM UTC). Định dạng của thời điểm đó phụ thuộc vào múi giờ. Trong khi đó là cùng một điểm trong thời gian, "giá trị giờ" là không giống nhau giữa các múi giờ và người ta phải đưa vào tài khoản bù đắp từ UTC.

Dưới đây là một số mã để minh họa. Một điểm là thời gian được ghi lại theo ba cách khác nhau.

var moment = require('moment'); 

var localDate = new Date(); 
var localMoment = moment(); 
var utcMoment = moment.utc(); 
var utcDate = new Date(utcMoment.format()); 

//These are all the same 
console.log('localData unix = ' + localDate.valueOf()); 
console.log('localMoment unix = ' + localMoment.valueOf()); 
console.log('utcMoment unix = ' + utcMoment.valueOf()); 

//These formats are different 
console.log('localDate = ' + localDate); 
console.log('localMoment string = ' + localMoment.format()); 
console.log('utcMoment string = ' + utcMoment.format()); 
console.log('utcDate = ' + utcDate); 

//One to show conversion 
console.log('localDate as UTC format = ' + moment.utc(localDate).format()); 
console.log('localDate as UTC unix = ' + moment.utc(localDate).valueOf()); 

Những kết quả đầu ra này:

localData unix = 1415806206570 localMoment unix = 1415806206570 utcMoment unix = 1415806206570 localDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST) localMoment string = 2014-11-12T10:30:06-05:00 utcMoment string = 2014-11-12T15:30:06+00:00 utcDate = Wed Nov 12 2014 10:30:06 GMT-0500 (EST) localDate as UTC format = 2014-11-12T15:30:06+00:00 localDate as UTC unix = 1415806206570

Về mili giây, từng đều giống nhau. Đó là cùng một điểm chính xác trong thời gian (mặc dù trong một số lần chạy, mili giây sau đó là một điểm cao hơn).

Theo định dạng, mỗi định dạng có thể được thể hiện trong một múi giờ cụ thể. Và định dạng của chuỗi thời gian đó sẽ khác nhau, cho cùng một thời điểm chính xác!

Bạn sẽ so sánh các giá trị thời gian này? Chỉ cần chuyển đổi thành mili giây. Một giá trị mili giây luôn nhỏ hơn, bằng hoặc lớn hơn giá trị mili giây khác.

Bạn có muốn so sánh các giá trị 'giờ' hoặc 'ngày' cụ thể và lo lắng chúng "đến từ" múi giờ khác nhau không? Chuyển đổi sang UTC trước tiên bằng cách sử dụng moment.utc(existingDate) và sau đó thực hiện các thao tác. Ví dụ về các chuyển đổi đó, khi ra khỏi DB, là các cuộc gọi console.log cuối cùng trong ví dụ.

+5

Tôi nghĩ rằng bạn đang thiếu bản chất của câu hỏi. –

+0

Tôi trả lời theo cách này bởi vì câu hỏi của ông cho thấy việc sử dụng MomentJS. Ý tưởng là dấu thời gian (các số) là giá trị thực và định dạng ngày (các từ) thường phụ thuộc vào múi giờ địa phương. – clay

1

Gọi toDate sẽ tạo ra một sao chép (tài liệu không đúng về việc không phải là bản sao), của đối tượng JS Date bên dưới. Đối tượng Date JS được lưu trữ trong UTC và sẽ luôn in ở thời gian phía đông. Mà không đi vào việc liệu .utc() sửa đổi đối tượng bên dưới mà thời điểm kết thúc tốt đẹp sử dụng mã dưới đây.

Bạn không cần thời gian cho việc này.

new Date().getTime() 

Công trình này, vì JS Ngày lõi của nó nằm trong UTC từ Unix Epoch. Nó gây nhầm lẫn lạ thường và tôi tin rằng một lỗ hổng lớn trong giao diện để kết hợp thời gian địa phương và UTC như thế này mà không có mô tả trong các phương pháp.

Các vấn đề liên quan