2016-05-22 2 views
0

Я довольно новичок в этом, поэтому извиняюсь, если ответ очевиден.Добавление дней до даты - Скрипты Google

Я пытаюсь добавить и вычесть дни с сегодняшней даты. Идея состоит в том, чтобы в конечном итоге рассчитать дату следующего понедельника и в последний понедельник.

Я посмотрел here, который решил мою первую проблему, но следующий озадачивает меня: вычитание дней с сегодняшнего дня работает без проблем. Добавление дает недопустимую дату.

Код:

function findDate() { 
    var d = new Date(); 
    var n = d.getDay(); 
    var makeDate = new Date(d.setDate(d.getDate())); 
    Logger.log(makeDate) 
    var weekDaysTo = new Array(7); //array of days to following Monday 
    weekDaysTo[0]= 1 
     weekDaysTo[1] = 7 
     weekDaysTo[2] = 6 
     weekDaysTo[3] = 5 
     weekDaysTo[4] = 4 
     weekDaysTo[5] = 3 
     weekDaysTo[6] = 2 

    Logger.log('weekDaysTo gives '+weekDaysTo[n]) 

    var weekDaysFrom = new Array(7); //array of days to previous Monday 
     weekDaysFrom[0]= 6 
     weekDaysFrom[1] = 0 
     weekDaysFrom[2] = 1 
     weekDaysFrom[3] = 2 
     weekDaysFrom[4] = 3 
     weekDaysFrom[5] = 4 
     weekDaysFrom[6] = 5 

    var prevMon = new Date(makeDate+weekDaysTo[n]*3600000*24); //Converts ms  into days and adds 

    Logger.log('Next Monday is '+prevMon); 

    var followingMon = new Date(makeDate-weekDaysFrom[n]*3600000*24); //Converts ms into days 
    Logger.log('Last Monday was ' +followingMon); 

Журнал Выход:

[16-05-22 21:17:58:419 ICT] Sun May 22 21:17:58 GMT+07:00 2016 
[16-05-22 21:17:58:419 ICT] weekDaysTo gives 1 
[16-05-22 21:17:58:420 ICT] Next Monday is Invalid Date 
[16-05-22 21:17:58:420 ICT] Last Monday was Mon May 16 2016 21:17:58 GMT+0700 (ICT) 

Это независимо от значения I добавить к дате. Я не понимаю, почему вычитание работает нормально, но добавляет причины недопустимой даты. Изменение добавленных чисел не влияет, сменяя его на вычитание.

ответ

0

Это потому, что JavaScript обрабатывает сложение и вычитание в зависимости от типов операндов.

> new Date() 
Sun May 22 2016 14:45:00 GMT+0000 (UTC) 
> new Date()+1 
'Sun May 22 2016 14:45:05 GMT+0000 (UTC)1' 
> new Date()-1 
1463928307077 

В вашем примере, вы должны попытаться преобразовать makeDate в миллисекундах перед выполнением того, либо делая +makeDate или makeDate.getTime().

Например, вместо:

var prevMon = new Date(makeDate+weekDaysTo[n]*3600000*24); 

Try:

var prevMon = new Date(+makeDate+weekDaysTo[n]*3600000*24); 
+0

Вот есть! И узнал что-то новое. Спасибо! –

0

Это крайне запутанный код для получения следующего понедельника. Возможно, это работает, но рассмотрим гораздо более простой алгоритм. Надеюсь, что комментарии являются достаточными:

/* Given a date, return a new date for the following Monday. 
 
** If date is a Monday, returns the following Monday. 
 
** 
 
** @param {Date} date - date to get next Monday of. 
 
**     - Default is current date. 
 
** @returns {Date} - date for next Monday. 
 
*/ 
 
function getNextMonday(date) { 
 
    // Copy provided date or use current date 
 
    date = date? new Date(+date) : new Date(); 
 

 
    // Get the day number 
 
    var dayNum = date.getDay(); 
 

 
    // Set date to next Monday 
 
    date.setDate(date.getDate() + (dayNum? 8 - dayNum: 1)); 
 
    return date; 
 
} 
 

 
var x = new Date(2016,4,29) 
 
document.write('Start date: ' + x + '<br>Next Monday: ' + getNextMonday(x)); 
 
x = new Date(); 
 
document.write('<br><br>Start date: ' + x + '<br>Next Monday: ' + getNextMonday());

Вот аналогичная функция для получения предыдущий понедельник:

function getPreviousMonday(date) { 
    date = date? new Date(+date) : new Date(); 
    var dayNum = date.getDay(); 
    // If Sunday, subtract 6. If Monday, subtract 7. Otherwise subtract dayNum - 1 
    date.setDate(date.getDate() - (dayNum? (dayNum - 1 || 7) : 6)); 
    return date; 
} 
+0

Convoluted - это слово, используемое для описания моей прогамминга (и, возможно, меня!) С моих университетских дней. Это намного более элегантно. Спасибо. –

Смежные вопросы