Chuyển đổi Moment.js thành đối tượng ngày


696

Sử dụng Moment.js Tôi không thể chuyển đổi một đối tượng khoảnh khắc chính xác thành một đối tượng ngày có múi giờ. Tôi không thể có được ngày chính xác.

Thí dụ:

var oldDate = new Date(),
    momentObj = moment(oldDate).tz("MST7MDT"),
    newDate = momentObj.toDate();
console.log("start date " + oldDate)
console.log("Format from moment with offset " + momentObj.format())
console.log("Format from moment without offset " + momentObj.utc().format())
console.log("(Date object) Time with offset " + newDate)
console.log("(Date object) Time without offset "+ moment.utc(newDate).toDate())

1
Đầu ra nào bạn mong đợi và đầu ra nào bạn nhận được?
Felix Kling

4
4 liên tiếp làm cho tôi nên đầu ra: <code> (ngày đối tượng) Thời gian với bù đắp Thu ngày 01 tháng 8 năm 2013 15:23:49 GMT + 0300 (Финляндия (лето)) </ code> Nhưng múi giờ phải MST7MDT
vadim.zhiltsov

Wednesday 24th 2019, 12:47:48 amđiều này có thể chuyển đổi thành 2019-04-23T19:17:48.000Z ? @ vadim.zhiltsov
Anupam Maurya

Các đối tượng ngày không có múi giờ, chúng chỉ là phần bù từ 1970-01-01T00: 00: 00Z. Vì vậy, khi bạn gọi toDate , đối tượng được trả về đã mất thông tin múi giờ bạn đính kèm với đối tượng khoảnh khắc .tz("MST7MDT"). Đó là lý do tại sao các thư viện như khoảnh khắc.tz tồn tại, để bổ sung khả năng xương cốt của đối tượng Date được xây dựng, chỉ hiểu UTC và múi giờ của máy chủ, đó là điều đó.
RobG

Câu trả lời:


1234

Sử dụng công cụ này để chuyển đổi một đối tượng khoảnh khắc thành một đối tượng ngày:

Từ http://momentjs.com/docs/#/displaying/as-javascript-date/

moment().toDate();

Sản lượng:

Tue Nov 04 2014 14:04:01 GMT-0600 (CST)

11
@Spencer - Vâng, nó trả lời tiêu đề, và toDatethực sự là làm thế nào để có được một Dateđối tượng từ a moment. Nhưng mã trong phần thân của câu hỏi hỏi về chuyển đổi múi giờ - điều Datekhông thể làm được. Trừ khi giờ miền núi thực sự là múi giờ của người dùng, thì tôi không chắc điều này đã trả lời câu hỏi như thế nào.
Matt Johnson-Pint

1
@Matt nó chỉ phụ thuộc vào phần nào của câu hỏi bạn đang xem. Phần lớn mọi người tìm kiếm trên google và thấy rằng tiêu đề này phù hợp với câu hỏi của họ và đưa ra câu trả lời trả lời cho tiêu đề chứ không phải nội dung của câu hỏi. Điều đó có thể giải thích tại sao điều này có nhiều sự ủng hộ nhất mặc dù về mặt kỹ thuật nó không giúp ích gì cho OP.
Spencer

14
Đây thực sự là câu trả lời đúng? Câu hỏi là làm thế nào để chuyển đổi đối tượng khoảnh khắc thành ngày javascript nhưng với TIMEZONE. Nó vẫn hoàn nguyên về múi giờ cục bộ khi thay đổi thành đối tượng ngày javascript.
Không thể tiết lộ

1
Hey các bạn kiểm tra liên kết này khoảnh khắc js.com/guides/#/warnings/js-date . Điều này không được khuyến khích và sẽ được gỡ bỏ trong phiên bản chính sắp tới.
gtzinos

3
@gtzinos những gì bạn liên kết và đề cập đến là một vấn đề và kịch bản riêng biệt, ví dụ: truyền một chuỗi vào hàm tạo thời điểm moment("12/12/2011")là nơi bạn sẽ nhận được thông báo đó. Nó không có gì để làm với việc đi từ lúc này đến ngày objmoment().toDate()
btbJosh

51

Miễn là bạn đã khởi tạo múi giờ thời gian với dữ liệu cho các vùng bạn muốn , mã của bạn sẽ hoạt động như mong đợi.

Bạn đang chuyển đổi chính xác khoảnh khắc sang múi giờ, được phản ánh trong dòng đầu ra thứ hai từ momentObj.format().

Chuyển sang UTC không chỉ bỏ phần bù, nó sẽ chuyển về múi giờ UTC. Nếu bạn định làm điều đó, bạn hoàn toàn không cần .tz()cuộc gọi ban đầu . Bạn chỉ có thể làm moment.utc().

Có lẽ bạn chỉ đang cố gắng thay đổi chuỗi định dạng đầu ra? Nếu vậy, chỉ cần xác định các tham số bạn muốn cho formatphương thức:

momentObj.format("YYYY-MM-DD HH:mm:ss")

Về dòng cuối cùng của mã của bạn - khi bạn quay lại một Dateđối tượng đang sử dụng toDate(), bạn đang từ bỏ hành vi của Moment.js và quay lại hành vi của JavaScript. Một Dateđối tượng JavaScript sẽ luôn được in theo múi giờ địa phương của máy tính đang chạy. Không có gì khoảnh khắc.js có thể làm về điều đó.

Một vài điều nhỏ nhặt khác:

  • Trong khi các nhà xây dựng khoảnh khắc có thể mất một Date, tốt nhất là không sử dụng một. Đối với "bây giờ", không sử dụng moment(new Date()). Thay vào đó, chỉ cần sử dụng moment(). Cả hai sẽ hoạt động nhưng nó không cần thiết. Nếu bạn đang phân tích cú pháp từ một chuỗi, hãy chuyển chuỗi đó trực tiếp vào khoảnh khắc. Đừng cố phân tích nó Datetrước. Bạn sẽ thấy trình phân tích cú pháp của khoảnh khắc đáng tin cậy hơn nhiều.

  • Các múi giờ như MST7MDTcó vì lý do tương thích ngược. Chúng xuất phát từ các múi giờ kiểu POSIX và chỉ một vài trong số chúng nằm trong dữ liệu TZDB. Trừ khi thực sự cần thiết, bạn nên sử dụng một khóa như America/Denver.


Cảm ơn Matt! Câu trả lời của bạn rất hữu ích. Như bạn đã đề cập về việc sử dụng America / Denver thay vì MST7MDT, Có bản đồ nào cho những ánh xạ này không? Tôi đang sử dụng khá nhiều múi giờ như CET, EET, EST5EDT, CST6CDT, PST8PDT.
monish001

có thể chuyển đổi, ví dụ: "10:20 AM" (Thời gian chuỗi thu được từ thời điểm (). format ('hh: mm A')) sang đối tượng Date ??
ram

2
@ram - 1) nếu bạn có thời gian, chỉ cần sử dụng .toDate(). 2) Đừng sử dụng ý kiến ​​để đặt câu hỏi mới. Đó là nút "Đặt câu hỏi" lớn để làm gì.
Matt Johnson-Pint

22

.toDate không thực sự làm việc cho tôi, vì vậy, đây là những gì tôi đã làm:

futureStartAtDate = new Date(moment().locale("en").add(1, 'd').format("MMM DD, YYYY HH:MM"))

hi vọng điêu nay co ich


2
Câu trả lời này không trả lời câu hỏi. Mã là một cách viết dài dòng moment().add(1, 'd').toDate().
RobG

12

Vì khoảnh khắc không có quyền kiểm soát đối tượng ngày javascript, tôi đã tìm thấy một công việc xoay quanh vấn đề này.

const currentTime = new Date();    
const convertTime = moment(currentTime).tz(timezone).format("YYYY-MM-DD HH:mm:ss");
const convertTimeObject = new Date(convertTime);

Điều này sẽ cung cấp cho bạn một đối tượng ngày javascript với thời gian được chuyển đổi


2
Đây là câu trả lời đúng duy nhất trả lời trực tiếp câu hỏi.
Anish Sana

1
Đây chính xác là những gì tôi muốn. Tôi đã mong đợi Ngày bản địa thể hiện chính xác các múi giờ, nhưng tôi đã sai một cách đáng buồn.
mklbtz

1
Định dạng "YYYY-MM-DD HH: mm: ss" không được Safari hỗ trợ, do đó kết quả là null . Định dạng phải là "YYYY-MM-DDTHH: mm: ss" (sử dụng định dạng được hỗ trợ ECMAScript, "T" giữa các phần ngày và giờ).
RobG

4

Tôi cần phải có thông tin múi giờ trong chuỗi ngày của tôi. Ban đầu tôi đang sử dụng moment.tz(dateStr, 'America/New_York').toString();nhưng sau đó tôi bắt đầu gặp lỗi về việc cho chuỗi đó trở lại vào khoảnh khắc.

Tôi đã thử moment.tz(dateStr, 'America/New_York').toDate();nhưng sau đó tôi mất thông tin múi giờ mà tôi cần.

Giải pháp duy nhất trả về chuỗi ngày có thể sử dụng với múi giờ có thể được đưa trở lại vào khoảnh khắc làmoment.tz(dateStr, 'America/New_York').format();


4
let dateVar = moment('any date value');
let newDateVar = dateVar.utc().format();

Đẹp và sạch sẽ!!!!


Đây là giải pháp duy nhất ở đây trong trường hợp của tôi có định dạng utc. Cảm ơn
Luis Febro

3

Để chuyển đổi bất kỳ ngày nào, ví dụ utc:

moment( moment().utc().format( "YYYY-MM-DD HH:mm:ss" )).toDate()

2
Điều này thực sự đã cứu ngày của tôi!
HV Sharma

Câu trả lời này là sai. Nó áp dụng bù thời gian hai lần: moment().utc()trả về các giá trị cho UTC, sau đó .format( "YYYY-MM-DD HH:mm:ss" )trả về một chuỗi đã được đặt thành UTC mà không có bù múi giờ nên được phân tích thành cục bộ. Nó không khớp với định dạng khoảnh khắc mặc định do đó được phân tích cú pháp bởi trình phân tích cú pháp tích hợp. Nó cũng không khớp với bất kỳ định dạng được hỗ trợ ECMAScript nào, vì vậy phân tích cú pháp phụ thuộc vào việc triển khai. Dù sao, nó được phân tích cú pháp dưới dạng cục bộ để bù thời gian được áp dụng lại khi tạo giá trị thời gian của Ngày.
Cướp

3

Câu hỏi hơi mơ hồ. Tôi sẽ làm hết sức mình để giải thích điều này. Trước tiên bạn nên hiểu cách sử dụng múi giờ . Theo câu trả lời này ở đây TypeError: khoảnh khắc (). Tz không phải là một hàm , bạn phải nhập khoảnh khắc từ múi giờ thay vì thời điểm mặc định (trước tiên bạn sẽ phải cài đặt npm timezone timezone!). Vì lợi ích của sự rõ ràng,

const moment=require('moment-timezone')//import from moment-timezone

Bây giờ để sử dụng tính năng múi giờ, hãy sử dụng khoảnh khắc.tz ("date_opes / khoảnh khắc ()", "time_zone") (truy cập https://momentjs.com/timezone/ để biết thêm chi tiết). Hàm này sẽ trả về một đối tượng khoảnh khắc với múi giờ cụ thể. Vì lợi ích của sự rõ ràng,

var newYork= moment.tz("2014-06-01 12:00", "America/New_York");/*this code will consider NewYork as the timezone.*/

Bây giờ khi bạn cố gắng chuyển đổi newYork (đối tượng khoảnh khắc) bằng toDate () (chuyển đổi định dạng ISO 8601), bạn sẽ có được thời gian của Greenwich, Vương quốc Anh. Để biết thêm chi tiết, đi qua bài viết này https://www.nhc.noaa.gov/aboututc.shtml , về UTC. Tuy nhiên, nếu bạn chỉ muốn giờ địa phương của mình ở định dạng này (giờ New York, theo ví dụ này), chỉ cần thêm phương thức .utc (true) , với đối số true , vào đối tượng khoảnh khắc của bạn. Vì lợi ích của sự rõ ràng,

newYork.toDate()//will give you the Greenwich ,UK, time.

newYork.utc(true).toDate()//will give you the local time. according to the moment.tz method arg we specified above, it is 12:00.you can ofcourse change this by using moment()

Nói ngắn gọn, khoảnh khắc.tz xem xét múi giờ bạn chỉ định và so sánh thời gian địa phương của bạn với thời gian ở Greenwich để cung cấp cho bạn một kết quả. Tôi hy vọng điều này là hữu ích.


2

Khoảnh khắc đã cập nhật lib js kể từ ngày 06/2018.

var newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
var losAngeles = newYork.clone().tz("America/Los_Angeles");
var london     = newYork.clone().tz("Europe/London");

newYork.format();    // 2014-06-01T12:00:00-04:00
losAngeles.format(); // 2014-06-01T09:00:00-07:00
london.format();     // 2014-06-01T17:00:00+01:00

nếu bạn có quyền tự do sử dụng Angular5 +, thì nên sử dụng tính năng datePipe ở đó tốt hơn chức năng múi giờ ở đây. Tôi phải sử dụng Moment.js vì dự án của tôi chỉ giới hạn ở Angular2.


1

thử (không có formatbước)

new Date(moment())


new Date(moment())tương đương với new Date(). Múi giờ chỉ được đặt cho d .
RobG
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.