2013-02-08 23 views
5

Trước hết, tôi KHÔNG tìm kiếm xem liệu DST có hiệu lực cục bộ hay không.Ngày Javascript - cách biết liệu DST có hiệu lực trong một múi giờ nhất định không

Tôi đang chạy quy trình Node có dữ liệu có dấu thời gian được liên kết. Tôi cần phải chuyển đổi các dấu thời gian đó thành một ngày/tháng/năm trong một múi giờ đã chỉ định, nhưng tất cả những gì tôi được cung cấp là bù trừ múi giờ và bù đắp DST.

Tôi muốn Ngày/Giờ hoạt động tốt hơn với múi giờ. Họ làm việc tuyệt vời với UTC hoặc múi giờ địa phương, nhưng có vẻ như bạn cần phải hack nó để có được một cái gì đó khác.

Có điều gì tôi thiếu không? Giả sử tôi có thể xác định xem DST có hiệu lực, sẽ làm việc này:

var d = new Date(ts + timezone_offset - local_offset); 
d.getMonth(); 
d.getDate(); 

nơi timezone_offset được múi giờ bù đắp (hoặc tiêu chuẩn bù đắp hoặc dst một)?

Làm cách nào để xác định liệu DST có hiệu lực không?

+0

đây là một bản sao: http://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time- trong-javascript? rq = 1 – kmote

+0

điều này thực sự khá dễ dàng, bạn chỉ cần thực hiện một vài so sánh ngày, xem repo của tôi ở đây cho một ví dụ mở rộng: https://github.com/jthoburn/Date.toString.js – runspired

+0

cụ thể, xem mã cho ' Tôi 'và sửa đổi nó để sử dụng phương pháp này: http://stackoverflow.com/a/14636431/1883464 – runspired

Trả lời

0

Tôi đang thiếu cái gì? Giả sử tôi có thể xác định xem liệu DST có hiệu lực hay không, điều này có hoạt động ở đâu timezone_offset là chênh lệch múi giờ được yêu cầu không?

Cố gắng luôn sử dụng các phương pháp UTC để lấy thuộc tính ngày tháng. Bằng cách đó múi giờ địa phương (máy chủ) của bạn sẽ không ảnh hưởng đến bất kỳ tính toán:

var d = new Date(ts + timezone_offset); 
d.getUTCMonth(); 
d.getUTCDate(); 

Làm thế nào tôi có thể xác định xem DST có hiệu lực?

Điều đó phức tạp. Có/là nhiều thuật toán khác nhau để xác định DST bắt đầu và kết thúc, tùy thuộc vào khu vực - xem ví dụ http://en.wikipedia.org/wiki/Daylight_saving_time_by_country.

Tôi không biết liệu có bất kỳ thư viện nào đã mã hóa các thư viện này hay thậm chí có thể liên hệ với timezone database để biết thông tin chính xác. Phương sách cuối cùng sẽ là tự hỏi người dùng về chi tiết múi giờ.

0

moment.js (http://momentjs.com/) có hàm isDST. Bạn có thể sử dụng thời điểm (rất nhiều đơn giản), hoặc kiểm tra xem nó được thực hiện như thế nào.

moment(your_date).isDST(); 
+2

Điều đó sẽ chỉ hoạt động nếu bạn đang kiểm tra xem ngày có trong DST trong múi giờ * cục bộ * của bạn hay không. Không phải trong một số khu vực tùy ý khác. –

2

Thứ nhất, nhận ra rằng nếu tất cả các bạn có là offsets, bạn không thể giải quyết vấn đề này. Bạn phải có số nhận dạng múi giờ, chẳng hạn như "America/New_York". Vì trong phần bình luận câu hỏi bạn nói bạn thực sự có điều này, bạn có thể sử dụng one of these libraries để hoàn thành công việc. Trước đây tôi đã đăng một câu trả lời khác cho câu hỏi này, đề xuất TimeZoneJS, nhưng tôi sẽ rút lại ngay bây giờ - vì câu hỏi này đặc biệt về DST và TimeZoneJS có lỗi, báo cáo giá trị không chính xác gần chuyển tiếp DST.

Thay vào đó, tôi sẽ khuyên bạn sử dụng moment.js với tiện ích bổ sung moment-timezone.Khi cài đặt cả hai thư viện (đang được bảo đảm để tải dữ liệu múi giờ thực tế, theo các tài liệu), mã này là khá đơn giản:

moment(timestamp).tz(timezone).isDST() 

Ví dụ:

moment(1451624400000).tz('America/New_York').isDST(); // false 
moment(1467345600000).tz('America/New_York').isDST(); // true 

Hoặc, nếu timestamps của bạn đã xâu theo thời gian địa phương, sau đó sử dụng cú pháp này thay thế:

moment.tz('2016-01-01T00:00:00','America/New_York').isDST(); // false 
moment.tz('2016-07-01T00:00:00','America/New_York').isDST(); // true 
+0

Thư viện này có sử dụng đối tượng Date làm proxy dưới mui xe như timezoneJS không? Hay họ đã thực hiện mọi thứ từ đầu? – matf

+0

Hiện tại, Moment hiện đang sử dụng đối tượng 'Date' cho một số thứ, nhưng tính đến tất cả các quirks khác nhau. Tuy nhiên, chúng tôi có [một mục mở] (https://github.com/moment/moment/issues/2617) để xem xét việc xóa nó. Múi giờ thời gian thực hiện mọi thứ từ đầu liên quan đến múi giờ. Nó không dựa vào đối tượng Date để chuyển đổi múi giờ. –

+0

Tôi đã thử nghiệm các trường hợp mà timezoneJS sẽ thất bại và chúng hoạt động chính xác với múi giờ. – matf