2015-10-28 11 views
5

Pracuję nad aplikacją, w której wszystkie używane daty są okrągłymi datami GMT, np. 2015-10-29T00:00:00.000Z.Dodaj dni do daty bez zmiany czasu GMT

Używam następujące funkcje, aby dodać dni do daty:

function addDays(date, days) { 
    var result = new Date(date); 
    result.setDate(result.getDate() + days); 
    return result; 
} 

Ale zdałem sobie sprawę, że nie działa podczas przekraczania czasu letniego zmieniając dni:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addDays(myDate, 1); 
} 

Wyjścia to :

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T01:00:00.000Z" 
      ^
"2015-10-27T01:00:00.000Z" 
      ^

Pamiętaj, że dwie ostatnie daty nie są już okrągłe.

Jaki jest właściwy sposób radzenia sobie z tym?

+0

Użyj http://www.datejs.com jest bardzo wydajny i obsługuje większość, jeśli scenariusze .. –

Odpowiedz

0

Problem polega na tym, że Date.setDate() dodaje dzień bez zmiany lokalny czas. Ale to oznacza, że ​​czas GMT się zmienia!

Korzystanie Date.setUTCDate() rozwiązuje problem:

function addUTCDays(date, days) { 
    var result = new Date(date); 
    result.setUTCDate(result.getUTCDate() + days); 
    //  ^^^    ^^^ 
    return result; 
} 

wówczas:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addUTCDays(myDate, 1); 
} 

Wyjścia to:

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T00:00:00.000Z" 
"2015-10-27T00:00:00.000Z" 

to będzie działać również w miesiącach:

function addMonths(date, months) { 
    var result = new Date(date); 
    result.setUTCMonth(result.getUTCMonth() + months); 
    return result; 
} 
3

Edytuj: Właściwie znalazłem rozwiązanie, które jest zdecydowanie lepsze. Opuszczam to ze względu na wyczerpanie.

Problem polega na tym, że Date.setDate() dodaje dzień bez zmiany lokalnego czasu lokalny. Ale to oznacza, że ​​czas GMT się zmienia!

Dodawanie dzień bez zmiany czasu GMT jest rzeczywiście tak proste jak dodanie 24 * 3600 * 1000 milisekund czasu datę za:

function addGMTDays(date, days) { 
    var result = new Date(date); 
    result.setTime(result.getTime() + days * 24 * 3600 * 1000); 
    return result; 
} 

wówczas:

var myDate = new Date('2015-10-24T00:00:00.000Z'); 
for(i = 0; i<4; i++) { 
    console.log(JSON.stringify(myDate)); 
    myDate = addGMTDays(myDate, 1); 
} 

Wyjścia to:

"2015-10-24T00:00:00.000Z" 
"2015-10-25T00:00:00.000Z" 
"2015-10-26T00:00:00.000Z" 
"2015-10-27T00:00:00.000Z" 
+0

Musiałem przekonwertować wartości całkowite na LONG, aby uniknąć skracania –