2011-05-02 15 views
10

Tôi tò mò nếu có ai có bất kỳ giải pháp tốt để xây dựng chính xác ngày trước năm 1000 SCN - đặc biệt là năm 1 - 100 AD.Lời khuyên để làm việc với Pre-1000 A.D. Ngày trong JavaScript

Ví dụ, nếu tôi muốn xây dựng một ngày cho sự bắt đầu của thiên niên kỷ 1, tôi có thể không chỉ làm ...

new Date(Date.UTC(1,0,1,0,0,0,0)); 

vì nó cố gắng để được "thông minh" và cho rằng 1 là năm 1901, trong đó mang lại cho tôi ...

Sun Dec 31 1900 18:00:00 GMT-0600 (CST) 

điều tương tự cũng đi cho năm 99 ...

new Date(Date.UTC(99,0,1,0,0,0,0)); 

mà trở nên

Thu Dec 31 1998 18:00:00 GMT-0600 (CST) 

Suy nghĩ?

+1

Tôi thích điều này. Loại lỗi chống Y2K. Đây là chính xác những gì sẽ xảy ra khi mọi thứ được viết kém và sau đó tấn công xung quanh sau khi thực tế. –

+0

Bạn đang sử dụng 'getFullYear()' thay vì 'year' vì một số vấn đề với mâu thuẫn múi giờ sẽ xuất hiện?Có lẽ nếu tháng là -1 ví dụ nó có thể sẽ thay đổi trong năm? Chỉ tò mò thôi. – ErikE

Trả lời

2

Đây là giải pháp cơ bản mà tôi đã đưa ra. Nếu một ngày trước năm 1000, tôi chỉ thêm 1000 vào nó trong khi xây dựng ngày, sau đó sử dụng setUTCFullYear() sau đó.

if (year >= 0 && year < 1000) { 
    var d = new Date(Date.UTC(year + 1000,mon,day,hour,min,sec,0)); 
    d.setUTCFullYear(d.getFullYear() - 1000); 
    return d; 
} 

1000 có thể quá mức vì tôi chỉ gặp sự cố với ngày trước 100 ... nhưng, bất cứ điều gì.

0

Thực hiện một số ngày tùy ý d và gọi d.setUTCFullYear(myDate). Điều này dường như đang làm việc cho tôi trong bảng điều khiển của Chrome.

+0

giải pháp này sẽ chỉ đặt giá trị năm chính xác trong khi các thành phần thời gian khác sẽ là 'tùy ý'. * cười * Nhưng nghiêm túc, theo tinh thần của câu trả lời của bạn, bởi những gì tôi chắc chắn bạn có nghĩa là, tôi đồng ý đây là giải pháp sạch nhất. –

1

Bạn đã thử sử dụng setUTC... functions trên đối tượng ngày sau khi tạo?

setUTCDate() 
setUTCFullYear() 
setUTCMonth() 
setUTCHours() 
setUTCMinutes() 
setUTCSeconds() 
+0

Tôi cần chuyển đổi chuỗi ngày tháng SAP ("yyyymmdd") thành ngày JavaScript. SAP sử dụng các ngày từ 0001/01/01 đến 9999/12/31. Tôi đã phân tích cú pháp năm, tháng và ngày thành các chuỗi đơn, khởi tạo ngày mặc định 'var date = new Date (0);' và sử dụng các bộ định vị '.setUTC ...()'. Đừng quên rằng các tháng là 0-based (January = 0). – bassim

0

Một số khác đã cung cấp gợi ý khắc phục. Đối tượng ngày javascript đã được sao chép từ Java, vì vậy cũng có tất cả các lỗi của nó. Không có nhiều điểm cho Gregorian ngày trước 1582 kể từ trước khi các lịch khác nhau được sử dụng.

+0

wow, tôi hoàn toàn không biết rằng đối tượng ngày của Java tự động trừ đi 1900. yikes! điểm đến ngày Gregorian trước năm 1582 là lý do tại sao thậm chí có một tên cho một điều như vậy: một 'proleptic' lịch: http://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar –

0

Đó chính xác là những gì Date.UTC và chức năng hàm tạo Date (được gọi với số làm đối số) are supposed to do. Một cách giải quyết đơn giản là sử dụng Date.parse, mà sẽ không áp dụng bất kỳ sự điều chỉnh

new Date(Date.parse('0001-01-04')); 
new Date(Date.parse('0001-01-04T18:00:00Z')); 
+0

Tôi hiểu rằng các nhà thầu đã làm việc như thiết kế. Câu hỏi của tôi là làm thế nào để có được xung quanh nó. 'Date.parse()' là một giải pháp thú vị - cảm ơn. – broox

1

i thích:

var d = new Date(Date.UTC(year,mon,day,hour,min,sec,0)); 
d.setUTCFullYear(year); 

không nếu, và, hoặc nhưng nhân. theo nghĩa đen. ;)

setUTCFullYear() gọi sửa lỗi cố ý lỗi của JavaScript nếu bạn hỏi tôi. Tôi hoàn toàn cho tín dụng cho bạn tho, broox. tôi đã thấy giải pháp tuyệt vời của bạn và chỉ cần thực hiện thêm 2 bước nữa: không cần phải trừ đi bất kỳ năm nào khi chúng tôi đã có năm chính xác trong một biến. và không cần câu lệnh if khi chúng ta luôn có thể thực thi khối if.

cảm ơn câu trả lời đã được siêu của bạn, broox!

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