2015-11-29 13 views
8

Tôi chỉ thấy rằng nếu tôi sử dụng new Date('2015-1-1'), thì thời gian không có hiệu ứng múi giờ, nhưng nếu tôi sử dụng new Date('2015-01-01') thì thời gian có hiệu ứng múi giờ trong Node.js.Đầu ra ngày ('2015-1-1') khác với Ngày (2015-01-01)

tôi ra 4 Date():

console.log(new Date('2015-1-1')); 
    console.log(new Date('2015-01-1')); 
    console.log(new Date('2015-1-01')); 
    console.log(new Date('2015-01-01')); 

đầu ra là

Thu Jan 01 2015 00:00:00 GMT+0800 (CST) 
Thu Jan 01 2015 00:00:00 GMT+0800 (CST) 
Thu Jan 01 2015 00:00:00 GMT+0800 (CST) 
Thu Jan 01 2015 08:00:00 GMT+0800 (CST) 

bạn sẽ nhìn thấy lần cuối cùng là 08:00:00 bởi vì tôi là trong 8 múi giờ.

Tôi nghĩ đầu ra phụ thuộc vào chữ số của tháng hoặc số ngày. Khi đó là 10, 11 hoặc 12, đầu ra luôn là 08:00:00

Tôi tự hỏi tại sao và nếu có cách nào tốt hơn để xử lý việc này ngoại trừ kiểm tra thủ công bit tháng và số ngày?

+1

tôi nhận được đầu ra tương tự khi tôi chạy ví dụ của bạn trên Chrome bảng điều khiển Javascript để nó có vẻ là một lỗi/tính năng V8. – HBP

+0

Trong Firefox, tôi nhận được ngày không hợp lệ cho tất cả trừ dòng cuối cùng. Ngoài ra, tôi đã tìm thấy điều này từ MDN: [Sự khác biệt trong múi giờ giả định] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse#Differences_in_assumed_time_zone) – Kobi

+5

Tuy nhiên một vấn đề khác với phân tích chuỗi ngày tháng. ** Chỉ ** cách đáng tin cậy để phân tích cú pháp chuỗi ngày là thực hiện thủ công (mặc dù thư viện có thể trợ giúp về điều đó). 3 chuỗi đầu tiên không chính xác là chuỗi ISO 8601 do đó có thể được phân tích cú pháp, tuy nhiên việc triển khai thực hiện mong muốn. Cuối cùng là định dạng ISO 8601. Mỗi ECMAScript 2015 nó được phân tích cú pháp là "cục bộ" thành hệ thống máy chủ. Dưới ES5, nó phải được phân tích cú pháp là UTC, và trước đó (tức là ECMAScript ed 3 trở về trước) mọi thứ, kể cả NaN. – RobG

Trả lời

1

Lên đến và bao gồm ECMA-262 ed 3, phân tích chuỗi ngày tháng hoàn toàn phụ thuộc vào việc triển khai thực hiện. Với ES5, chuỗi định dạng ISO 8601 không có múi giờ sẽ được phân tích cú pháp là UTC, tuy nhiên việc phân tích cú pháp bất kỳ loại chuỗi ngày tháng nào khác vẫn phụ thuộc vào việc triển khai thực hiện.

Với ECMAScript 2015, các chuỗi như vậy không có múi giờ sẽ được phân tích cú pháp là cục bộ (nghĩa là với giá trị bù trừ dựa trên cài đặt hệ thống). Vì vậy, có vẻ như việc triển khai Node.js của bạn không nhận ra 3 chuỗi đầu tiên là ISO 8601 và do đó phân tích chúng theo một số logic nội bộ khác xử lý chúng dưới dạng UTC.

Chuỗi cuối cùng được xem là tuân thủ ISO 8601 và được phân tích cú pháp là địa phương.

Nếu bạn muốn phân tích tất cả các chuỗi như địa phương, bạn có thể sử dụng một chức năng đơn giản như:

/* @param {string} s - date string in format yyyy-[m]m-[d]d 
 
** @returns {Date} - a Date object for the specified date in a 
 
** timezone based on system settings. 
 
** Assumes that the string is a valid date. 
 
*/ 
 
function parseISOLocal (s) { 
 
    var b = s.split(/\D/); 
 
    return new Date(b[0], b[1]-1, b[2]); 
 
} 
 

 
document.write(parseISOLocal('2015-1-1'))

+0

Với chức năng này, tôi nhận 'Thu Jan 01 2015 00:00:00 GMT + 0800 (CST)', không có chênh lệch múi giờ, nhưng 'Date ('2015-01-01') mặc định có bù trừ múi giờ. –

+0

@ BrickYang — cái đầu tiên không có chênh lệch múi giờ (+08: 00). – RobG

0

Có lẽ một lỗi, tốt nhất mà bạn có thể làm là sử dụng một thư viện như Moment mà dường như thoát khỏi này:

moment('2015-1-1').toString() 
moment('2015-1-01').toString() 
moment('2015-01-1').toString() 
moment('2015-01-01').toString() 

in:

"Thu Jan 01 2015 00:00:00 GMT+0100" 
"Thu Jan 01 2015 00:00:00 GMT+0100" 
"Thu Jan 01 2015 00:00:00 GMT+0100" 
"Thu Jan 01 2015 00:00:00 GMT+0100" 
+0

[Lỗi thực sự] (https://code.google.com/p/chromium/issues/detail?id=543320). –

+0

Không thực sự, nó chỉ xảy ra rằng moment.js, theo mặc định, có một hành vi nhất định.Bạn đã không giải thích tại sao OP lại nhận được kết quả mà họ nhận được. – RobG

+0

Không có ý tưởng tại sao, câu trả lời của tôi đã được đề cập đến "cách tốt hơn để xử lý này". Kể từ khi Moment dường như phù hợp về điều này và nó cũng cung cấp rất nhiều tính năng tốt đẹp có vẻ là một cách tốt để xử lý này. – Enrichman

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