Сценарий приложения возвращает текущую неделю как 3, в то время как это неделя 2

Чтобы получить текущую неделю, у меня есть этот фрагмент кода:

 var today = new Date();
  var week = Utilities.formatDate(today, "Europe/Amsterdam", "w"); 

Это возвращает today как Tue Jan 12 2021 11:30:42, что правильно, так как я нахожусь в Амстердаме. Но он возвращает текущую неделю как 3, в то время как это неделя 2. Оглядываясь назад в журналы прошлых недель, он возвращал неделю 2, хотя это была неделя 1. А за неделю до этого он возвращал неделю 53, что было правильно. Так что это работало нормально до нового года и полностью пропустило первую неделю. Есть идеи, как это исправить?


person Michiel the Temp    schedule 12.01.2021    source источник
comment
С чего ты взял, что это вторая неделя? formatDate в Apps Script форматирует дату. в соответствии с SimpleDateFormat в Java, который также возвращает неделя 3. Итак, если это действительно должна быть неделя 3, а не 2, то это будет проблема с классом Java, а не с методом скрипта приложений.   -  person Iamblichus    schedule 12.01.2021
comment
Я использую формат номера недели ISO, в котором текущая неделя указана как вторая неделя 2021 года. Я обнаружил, что это не проблема сценария приложения, поэтому смог исправить ее с помощью обходного пути. Спасибо!   -  person Michiel the Temp    schedule 12.01.2021


Ответы (1)


Объяснение:

Я не думаю, что есть реальная проблема.

Путаница возникает из-за того, что неделя 1 началась в прошлом году.

Если вы console.log все даты, начиная с 26th of December 2020 до 12th of January 2021:

function myFunction() {
  const December = [26,27,28,29,30,31];
  const January =[1,2,3,4,5,6,7,8,9,10,11,12,13];
  December.
  forEach(n=>{console.log(Utilities.formatDate(new Date(2020,11,n), "Europe/Amsterdam", "yyyy-MM-dd"),"Week: ",
Utilities.formatDate(new Date(2020,11,n), "Europe/Amsterdam", "w"))});
  January.
  forEach(n=>{console.log(Utilities.formatDate(new Date(2021,0,n), "Europe/Amsterdam", "yyyy-MM-dd"),"Week: ",
  Utilities.formatDate(new Date(2021,0,n), "Europe/Amsterdam", "w"))});
}

вы получите следующие результаты:

2020-12-26 Week:  52
2020-12-27 Week:  1 // Sunday
2020-12-28 Week:  1
2020-12-29 Week:  1
2020-12-30 Week:  1
2020-12-31 Week:  1
2021-01-01 Week:  1
2021-01-02 Week:  1
2021-01-03 Week:  2 // Sunday
2021-01-04 Week:  2
2021-01-05 Week:  2
2021-01-06 Week:  2
2021-01-07 Week:  2
2021-01-08 Week:  2
2021-01-09 Week:  2
2021-01-10 Week:  3 // Sunday
2021-01-11 Week:  3
2021-01-12 Week:  3
2021-01-13 Week:  3

По сути, 1st неделя в прошлом году началась 2020-12-27, 2nd неделя 2021-01-03, а 3rd неделя 2021-01-10, поэтому текущая неделя в соответствии с этой логикой — 3, что является числом, которое вы получаете.

Обходной путь:

Если вы хотите изменить эту логику, вы можете вычесть 1 из текущего номера недели, чтобы получить 2 в качестве текущего номера недели:

 var today = new Date();
 var week = Utilities.formatDate(today, "Europe/Amsterdam", "w") - 1;

Или вы можете использовать этот ответ и настроить номер недели:

function exampleFunction() {
    Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    return Math.ceil((((this - onejan) / 86400000) + onejan.getDay()+1)/7)-1;
    } 
    var now = new Date();
    Logger.log(now.getWeek());
}

Единственная проблема заключается в том, что первая неделя следующего года (который может быть и в этом году) будет иметь номер недели 0. Но вы можете настроить это с помощью условия if, чтобы этого не произошло.

person soMario    schedule 12.01.2021
comment
Спасибо за понимание! Не устареет ли обходной путь после того, как номера недель снова совпадут с номерами недель ISO? Я также нахожу этот ответ, который также может решить мою проблему: stackoverflow.com/questions/6117814/ - person Michiel the Temp; 12.01.2021
comment
@MichieltheTemp смотрите мой обновленный ответ. Проблема будет заключаться в том, что в первую неделю следующего года у вас будет 0, но я думаю, вы можете настроить это с помощью условия if. - person soMario; 12.01.2021
comment
Спасибо, рассмотрю этот обходной путь - person Michiel the Temp; 12.01.2021