2014-09-15 15 views
5

Cách định dạng ngày ISO BC bằng Moment.js?Cách định dạng ngày tháng BC (như "-700-01-01")?

moment("-700-01-01").year();  // 700 (WRONG) 
moment("-0700-01-01").year(); // 700 (WRONG) 
moment("-000700-01-01").year(); // -700 (RIGHT) 

Vì lý do nào đó, ký hiệu năm có 6 chữ số hoạt động. Đó có phải là cách "đúng" không? Tại sao ký hiệu không giống như "-700-01-01" hoạt động?

+3

Như một quy tắc chung, bạn không nên muốn điều này. Các tính toán ngày nay từ lâu sẽ trở nên vô cùng lộn xộn, và sai, theo định nghĩa, bởi vì lịch Gregorian chính nó không được chuẩn hóa trở lại sau đó. Tóm lại: không bao giờ có 'ngày 1 tháng 1' theo logic lịch của Moment.js, trong 700BC lịch duy nhất thỉnh thoảng được sử dụng là [Lịch của Numa] (http://en.wikipedia.org/wiki/ Roman_calendar # Calendar_of_Numa) tính 355 ngày mỗi năm. Lịch Gregorian không đáng tin cậy từ xa cho đến 1752AD. –

+1

có một số lý do tại sao thực sự làm điều này - có thể người dùng cần trình bày một số dữ liệu trên dòng thời gian được tạo bởi công cụ javascript "usuall" và do đó yêu cầu này hoàn toàn hợp lệ. Không ai nghi ngờ rằng ngày BC không đáng tin cậy, khi nói đến ngày trong tuần hoặc lâu hơn, nhưng vẫn cần phải có cách để làm điều đó. Thế giới đã không bắt đầu trên 1.1.1970 ... :) – Radek

Trả lời

3

Đây không phải là vấn đề cụ thể về Moment.js; điều tương tự cũng xảy ra nếu bạn cố gắng khởi tạo đối tượng Date() với chuỗi bạn đang sử dụng. Nếu bạn tạo nó như là một đối tượng Date() đầu tiên và tự gán năm sử dụng setYear() nó chấp nhận một ngày -700:

var date = new Date(); 

date.setYear(-700); 

moment(date).year(); 
> -700 

Tuy nhiên như Niels Keurentjes has pointed out, tính toán ngày này xa trở lại nhận được khá phức tạp và có thể không ở tất cả đáng tin cậy.

Nếu bạn muốn "-700-01-01" bạn có thể cấu hình các năm, tháng và ngày riêng biệt:

date.setYear(-700); 
date.setMonth(0); 
date.setDate(1); 

console.log(date); 
> Fri Jan 01 -700 11:53:57 GMT+0000 (GMT Standard Time) 

Là để cho dù ngày ngày 1 tháng 1 năm 700BC đã thực sự một thứ sáu ... bạn sẽ phải tự mình tìm kiếm.

+1

Cảm ơn, tạo ra một ngày như 'ngày mới (-700, 0, 1)' hoạt động thực sự tốt, nhưng tôi cần một ký hiệu serializable và ngày ISO là hoàn hảo cho điều đó. Bạn thực sự không thể so sánh Moment.js với trình phân tích cú pháp Ngày mặc định, moment.js cung cấp một loạt các tính năng của Date và giải quyết sự không tương thích giữa các trình duyệt. Vì vậy, tôi sẽ nói điều này * là * một vấn đề cụ thể về moment.js có thể được giải quyết bởi moment.js. Bất kỳ đầu mối về lý do tại sao 6 chữ số năm làm việc? –

0

trong ví dụ của bạn dấu trừ cũng được sử dụng làm dấu phân cách giữa năm, tháng và ngày. Như bạn đã chỉ ra trong nhận xét về câu trả lời của James, sử dụng hôn mê như dấu phân tách giúp phân biệt.

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