2015-05-21 51 views
6

Thông tin cơ bảnTrong khi vòng lặp đếm tăng dần "theo cấp số nhân" mặc dù sử dụng ++

tôi đang thiết lập một chức năng mà tạo ra một mảng ngày dựa trên một ngày bắt đầu và ngày kết thúc.

Hàm sẽ nhận ngày bắt đầu và ngày kết thúc, định dạng đầu tiên được định dạng thành định dạng year-month-dayT12:00:00:00 và sau đó được chuyển đổi thành mili giây với định dạng .getTime().

Kịch bản của tôi

tôi đã thực hiện các kịch bản sau đây để tạo mảng.

var $date_array = []; 

function calc_workdays_between_dates (a, b) { 

    function $create_date_array ($start_date, $end_date) { 

     var $counter = 0; 

     while ($start_date !== $end_date) { 

      var x = new Date($start_date); 

      x.setDate(x.getDate() + $counter); 
      $date_array.push(x); 
      $start_date = x.getTime(); 
      $counter++; 
     } 
    } 

    $create_date_array (a, b); 
} 

Xin lưu ý rằng có một lý do để làm tổ các $create_date_array chức năng bên trong $calc_workdays_between_dates chức năng. Bây giờ tôi đã loại bỏ tất cả các phần khác của hàm $calc_workdays_between_dates để tập trung hoàn toàn vào vấn đề (tôi cũng đang chạy thử nghiệm của mình trên phiên bản bị tước bỏ này - vì vậy phần còn lại của hàm không có ảnh hưởng đến bất kỳ thứ gì).

Vấn đề của tôi

Ví dụ 1:

Nếu tôi gọi hàm với calc_workdays_between_dates (x1, x2); nơi:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-07") 

nó kết quả trong $date_array nhận được các nội dung sau:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 

Như bạn có thể thấy hàm vì một số lý do bỏ qua thứ hai (một ngày trong tổng số).

Ví dụ 2:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-10") 

kết quả trong:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST) 

Như bạn có thể thấy các chức năng bằng cách nào đó bỏ qua thứ Hai, thứ Tư và thứ Năm (3 ngày trong tổng số).

Ví dụ 3:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-14") 

kết quả trong:

Sat Apr 04 2015 12:00:00 GMT+0200 (CEST) 
Sun Apr 05 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 07 2015 12:00:00 GMT+0200 (CEST) 
Fri Apr 10 2015 12:00:00 GMT+0200 (CEST) 
Tue Apr 14 2015 12:00:00 GMT+0200 (CEST) 

Như bạn có thể thấy các chức năng trong thise dụ bỏ qua thứ Hai, thứ Tư, thứ Năm, thứ Bảy, Chủ nhật và thứ Hai (6 ngày Tổng cộng).

Ví dụ 4:

x1 = new Date("2015-04-04") //formatted and converted to ms before invoking function 
x2 = new Date("2015-04-08") 

kết quả trong chức năng không làm việc. Có vẻ như vòng lặp while vẫn tiếp tục chạy không ngừng.

Câu hỏi của tôi

gì đang thực hiện kịch bản bỏ qua ngày?

+0

Ehm, '$ create_date_array' func của bạn hy vọng một 'Date' đối tượng, nhưng bạn đang đi qua một mảng (' x1 = [new Date ("2015-04- 04 ")]'). Tui bỏ lỡ điều gì vậy? –

+0

@NikolaDimitroff: Hàm '$ create_date_array' nhận các ngày theo mili giây sau đó được chuyển đổi thành ngày chính hàm của tôi trước khi thực hiện bất kỳ phép tính nào. Đó là một lỗi khác mà các ngày xuất hiện trong dấu ngoặc đơn. Tôi đã xóa chúng. – rabbitco

Trả lời

7

Bạn tính ngày tiếp theo dựa trên $start_datecounter. Tuy nhiên, trong vòng lặp while $start_date được gán lại và do đó không đại diện cho ngày bắt đầu nữa. Do đó, nó không được tăng lên với counter, nhưng chỉ với một.

Một giải pháp đúng sẽ là:

while ($start_date !== $end_date) { 
    var x = new Date($start_date); 
    x.setDate(x.getDate() + 1); 
    $date_array.push(x); 
    $start_date = x.getTime(); 
} 
+0

Ôi trời ơi - cảm ơn bạn @mvdssel. Đầu của tôi đang đau nhức khi nhìn chằm chằm vào kịch bản trong khoảng 90 phút ngay bây giờ. Tôi chỉ không thể nhìn thấy nó! Cảm ơn bạn rất nhiều! – rabbitco

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