Làm thế nào để chuyển đổi ngày Moment.js sang múi giờ địa phương của người dùng?


84

Tôi sử dụng khung Moment.js và Moment-Timezone, đồng thời có đối tượng ngày Moment.js rõ ràng trong múi giờ UTC. Làm cách nào để chuyển đổi múi giờ đó sang múi giờ hiện tại của trình duyệt?

var testDateUtc = moment.tz("2015-01-30 10:00:00", "UTC"); var localDate = ???

Vì vậy, sẽ ổn nếu tôi có thể tìm ra múi giờ địa phương của người dùng; hoặc cách khác, tôi muốn chuyển đổi đối tượng ngày tháng thành một đối tượng dữ liệu khác chỉ sử dụng "múi giờ địa phương", bất kể đó thực sự là gì.

Câu trả lời:


139

Bạn không cần phải sử dụng múi giờ thời gian cho việc này. Thư viện moment.js chính có đầy đủ chức năng để làm việc với UTC và múi giờ địa phương.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).local();

Từ đó, bạn có thể sử dụng bất kỳ chức năng nào mà bạn có thể mong đợi:

var s = localDate.format("YYYY-MM-DD HH:mm:ss");
var d = localDate.toDate();
// etc...

Lưu ý rằng bằng cách chuyển testDateUtc, là một momentđối tượng, trở lại phương thức moment()khởi tạo, nó sẽ tạo ra một bản sao . Nếu không, khi bạn gọi .local(), nó cũng sẽ thay đổi testDateUtcgiá trị, thay vì chỉ localDategiá trị. Các khoảnh khắc có thể thay đổi .

Cũng lưu ý rằng nếu thông tin đầu vào ban đầu của bạn chứa một khoảng thời gian bù trừ như +00:00hoặc Z, thì bạn có thể phân tích cú pháp trực tiếp với moment. Bạn không cần sử dụng .utchoặc .local. Ví dụ:

var localDate = moment("2015-01-30T10:00:00Z");

4
Bạn nên biết rằng phương pháp này không tính đến các khoản bù trừ DST, sẽ an toàn hơn khi sử dụng moment-timezonethư viện
Jaime Agudo

2
@Jaime không đúng. localthực sự có tính đến DST.
Matt Johnson-Pint

Bạn có thể tự kiểm tra ví dụ dịch từ ESTsang CET, ngày mai mình sẽ đưa ví dụ nếu bạn muốn like NY-> Madrid. Tôi sẽ chấp nhận mẫu ngược :)
Jaime Agudo

1
bạn chính xác rằng thời điểm không thể thực hiện loại chuyển đổi đó nếu không có múi giờ thời điểm. Tuy nhiên, nó có thể chuyển đổi đúng cách giữa UTC và local, đó là những gì OP đã yêu cầu.
Matt Johnson-Pint

2
Các quy tắc cục bộ đến từ trình duyệt. Vì vậy, miễn là múi giờ địa phương bao gồm DST, thời điểm sẽ sử dụng nó.
Matt Johnson-Pint

23
var dateFormat = 'YYYY-DD-MM HH:mm:ss';
var testDateUtc = moment.utc('2015-01-30 10:00:00');
var localDate = testDateUtc.local();
console.log(localDate.format(dateFormat)); // 2015-30-01 02:00:00
  1. Xác định định dạng ngày của bạn.
  2. Tạo một đối tượng thời điểm và đặt cờ UTC thành true trên đối tượng.
  3. Tạo một đối tượng thời điểm cục bộ hóa được chuyển đổi từ đối tượng thời điểm ban đầu.
  4. Trả về một chuỗi được định dạng từ đối tượng thời điểm được bản địa hóa.

Xem: http://momentjs.com/docs/#/manipulation/local/


Câu trả lời này thậm chí sẽ tốt hơn nếu nó giải thích lý do tại sao nó hoạt động, có lẽ với các tham chiếu đến tài liệu. Ngoài ra, bạn có thể muốn giải thích như thế nào câu trả lời này là khác nhau từ một posted tháng ba ...
Heretic Khỉ

@AndrewHenderson, Thời gian trước giờ máy cục bộ một giờ. Tại sao điều đó lại xảy ra?
Ramesh Papaganti

@RameshPapaganti Có lẽ Tiết kiệm ánh sáng ban ngày? Ví dụ PDT vs PST. Moment đã được biết là thay đổi API giữa các phiên bản, đặc biệt là khi nói đến bản địa hóa. Hãy cho tôi biết nếu bạn tìm thấy nguyên nhân.
AndrewHenderson

6

Đây là những gì tôi đã làm:

var timestamp = moment.unix({{ time }});
var utcOffset = moment().utcOffset();
var local_time = timestamp.add(utcOffset, "minutes");
var dateString = local_time.fromNow();

Trong trường hợp {{ time }}là dấu thời gian utc.


3

Sử dụng hàm utcOffset.

var testDateUtc = moment.utc("2015-01-30 10:00:00");
var localDate = moment(testDateUtc).utcOffset(10 * 60); //set timezone offset in minutes
console.log(localDate.format()); //2015-01-30T20:00:00+10:00
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.