Theo mặc định, MomentJS phân tích cú pháp theo giờ địa phương. Nếu chỉ cung cấp chuỗi ngày (không có thời gian), thời gian sẽ mặc định là nửa đêm.
Trong mã của bạn, bạn tạo một ngày địa phương và sau đó chuyển đổi nó sang múi giờ UTC (trên thực tế, nó làm cho phiên bản thời điểm chuyển sang chế độ UTC ), vì vậy khi nó được định dạng, nó sẽ bị dịch chuyển (tùy thuộc vào giờ địa phương của bạn) về phía trước hoặc ngược.
Nếu múi giờ địa phương là UTC + N (N là một số dương) và bạn phân tích cú pháp chuỗi chỉ ngày, bạn sẽ nhận được ngày trước đó.
Dưới đây là một số ví dụ để minh họa điều đó (thời gian bù giờ địa phương của tôi là UTC + 3 trong DST):
>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"
Nếu bạn muốn chuỗi ngày-giờ được hiểu là UTC, bạn nên nói rõ về nó:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
hoặc, như Matt Johnson đã đề cập trong câu trả lời của mình, bạn có thể ( và có lẽ nên ) phân tích cú pháp nó thành ngày UTC ngay từ đầu bằng cách sử dụng moment.utc()
và bao gồm chuỗi định dạng làm đối số thứ hai để ngăn chặn sự mơ hồ.
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"
Để đi ngược lại và chuyển đổi ngày UTC thành ngày địa phương, bạn có thể sử dụng local()
phương pháp như sau:
>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"
toString()
sauformat()
(nó đã trả về một chuỗi).