2010-11-05 28 views
7

Tôi có một phần của Javascript đơn giản trong ứng dụng của tôi có liên kết "Thêm ngày", thêm 1 ngày vào một ngày. Nó luôn luôn hoạt động hoàn hảo, trừ khi ngày được đến ngày 11/07/2010, và sau đó liên kết đột nhiên sẽ không hoạt động nữa. Nó thực sự đáng sợ, bởi vì nó chỉ treo lên vào ngày cụ thể của 11/07/2010.Ngày Javascript, đây có phải là lỗi của tôi hoặc tôi đã tìm thấy lỗi không?

Làm thế nào để tái tạo lỗi:

  1. Điều hướng đến trang here
  2. Trên bất kỳ lĩnh vực ngày, bấm vào nút "Hôm nay", hoặc chỉ cần thiết lập ngày đến ngày hôm nay.
  3. Nhấp vào "Thêm ngày" cho đến khi bạn nhận được đến 11/07/2010
  4. Bây giờ nhấp vào "Thêm ngày" không hoạt động nữa!
+0

Không cho tôi trên Chrome. Dường như làm việc tốt. – harpo

+1

Làm việc cho tôi (FF 3.6.12). Trình duyệt nào? –

+0

Làm việc cho tôi. Bạn đang dùng trình duyệt nào? Có lẽ bạn có thể bị cắn bởi một sự tính toán thời gian tiết kiệm ánh sáng ban ngày? –

Trả lời

13

Vấn đề là bạn đang thêm 24 giờ vào ngày để thêm một ngày; Thời gian tiết kiệm ánh sáng ban ngày đã cản trở bạn vì 24 giờ sau 00:00 vào ngày 7 tháng 11 sẽ là 23:00 (lần thứ hai) vào ngày 7 tháng 11.

+0

Và, tất nhiên, hành vi này sẽ tùy thuộc vào việc Thời gian tiết kiệm ánh sáng ban ngày kết thúc vào ngày 7 tháng 11 ở ngôn ngữ mà trình duyệt của bạn đang chạy hay không. –

+1

Rất thú vị. Tôi đang ở AZ - chúng tôi không có DST ở đây :) –

+0

+1 vì tôi gõ chậm: \ – Angiosperm

1

Thời gian tiết kiệm ánh sáng ban ngày. (Ở hầu hết các nơi ở Mỹ) thời gian quay trở lại vào Chủ nhật đầu tiên của tháng mười một. Mã của bạn chỉ thêm một số mili giây vào đầu ngày được chỉ định bởi hộp nhập và trả về đầu ngày kết quả: tuy nhiên do DST, chỉ cần thêm giây và cắt bớt ngày theo cách này sẽ không bao giờ tiến hành ngày .

3

Những người khác đã phát hiện ra vấn đề là gì.

Để khắc phục nó, bạn có thể sử dụng quá tải Date constructor mà mất năm, tháng, và trong ngày:

var aDate = new Date(2010, 10, 07); 
var aDatePlusOneDay = new Date(aDate.getFullYear(), 
           aDate.getMonth(), 
           aDate.getDate() + 1, // HERE 
           aDate.getHours(), 
           aDate.getMinutes(), 
           aDate.getSeconds(), 
           aDate.getMilliseconds()); 

Dưới đây là một giải pháp chung chung hơn có thể tăng bất cứ ngày một lượng millisecond nhất định, uống thay đổi tiết kiệm ánh sáng ban ngày vào tài khoản:

Date.addTicks = function(date, ticks) { 
    var newDate = new Date(date.getTime() + ticks); 
    var tzOffsetDelta = newDate.getTimezoneOffset() - date.getTimezoneOffset(); 
    return new Date(newDate.getTime() + tzOffsetDelta * 60000); 
} 

thêm một ngày đến một đối tượng Date sau đó là một vấn đề của việc thêm số mili giây trong một ngày:

Date.addTicks(new Date(2010, 10, 7), 86400000); // new Date(2010, 10, 8) 

Tài liệu tham khảo:

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