Utilities.formatDate начинает неделю на день 7 вместо дня 1 - PullRequest
1 голос
/ 11 января 2020

это НЕ дубликат
Согласно документации Utilities.formatDate(date, timeZone, format) работает в соответствии с Java спецификациями класса SE SimpleDateFormat .
Как вы можете легко сказать, ожидайте, что неделя начнется в понедельник, то есть в День 1.
Почему вместо этого моя неделя начинается в воскресенье, даже если она явно выводится как день 7?

screenshot

function testDate() {

  var ss         = SpreadsheetApp.getActiveSpreadsheet();
  var sheet      = ss.getSheetByName('history');
  var extension  = 2;
  var arrayDates = sheet.getRange(3, 2,  extension).getValues();

//flattening the array
function flatten(tdArray){return [].concat.apply([], tdArray);}  
  var arrayDates = flatten(arrayDates);

//"extracting" weeks' numbers from the dates
  var arrayWeekNums  = arrayDates.map(function(el){return Utilities.formatDate(el, "CET", "uyww");});
// CET = Central Europe Time
// u   = day of the week;
// y   = year in 4 digits;
// ww  = week numbers in 2 digits

Logger.log(arrayWeekNums); 
Logger.log(arrayDates);  
}


//Logger.log(arrayWeekNums);
//  [7201803, 6201802]
//  7-2018-03  week day: 7  ;  year: 2018  ;  week number: 03;
//  6-2018-02  week day: 6  ;  year: 2018  ;  week number: 02; ??

//Logger.log(arrayDates); 
//[20-01-11 22:21:54:187 CET] [Sun Jan 14 00:00:01 GMT+01:00 2018, Sat Jan 13 23:59:59 GMT+01:00 2018]

Я также переключил глобальные настройки своего проекта с США на любой европейский Contry: ничего не меняется.
Как я могу изменить это?

редактировать в соответствии с запросом:
1. "impostazioni internazionali", он же часовой пояс электронной таблицы (Файл> настройки электронной таблицы> языковой стандарт) на данный момент "Italia", но даже с "United States" это тот же результат;

2. часовой пояс сценария (Файл> настройки проекта): «GMT +01: 00 - Париж»

копия электронной таблицы: https://docs.google.com/spreadsheets/d/1f8ep3Hczo1jbu7s2PTGsaqog8qkW-dc9MAeYNOEBRbw/edit?usp=sharing

1 Ответ

2 голосов
/ 12 января 2020

Не думаю, что это проблема с настройками локали или часового пояса.

Я запускал скрипт для разных моментов времени, и это то, что я нашел.

Это Кажется, что числа дня недели (dotw) и недели недели (woty) не связаны.

В любом году week-1 не начинается с 1-й понедельник того года.

Dotw строго понедельник = 1, вт = 2 и т. д. c.

Woty это сложно.

Похоже что год будет иметь 53 недели, если 53-я неделя может быть завершена к 31-му дню c.

В противном случае год будет иметь 52 недели. И «неделя 1» следующего года начнется в декабре предыдущего года.

Например, 2016 год закончился на 53-й неделе. И 2017 год начался на «неделе 1»:

Date           Doty*  Dotw Woty    
23-Dec-2016    358    5    52
24-Dec-2016    359    6    52
25-Dec-2016    360    7    53
26-Dec-2016    361    1    53
27-Dec-2016    362    2    53
28-Dec-2016    363    3    53
29-Dec-2016    364    4    53
30-Dec-2016    365    5    53
31-Dec-2016    366    6    53
01-Jan-2017    1      7    1
02-Jan-2017    2      1    1
03-Jan-2017    3      2    1
                                     *Day of the year

Но в 2017 году, поскольку 53-я неделя не могла быть проведена до конца года, 31-го декабря c -17 была на «неделе 1» 2018:

Date          Doty    Dotw Woty    
29-Dec-2017    363    5    52
30-Dec-2017    364    6    52
31-Dec-2017    365    7    1
01-Jan-2018    1      1    1
02-Jan-2018    2      2    1
03-Jan-2018    3      3    1

Аналогично для 2019-20, 52-я неделя закончилась 28-De c -19. И «неделя 1» 2020 года, начавшаяся 29-го декабря c -19:

Date           Doty   Dotw Woty    
27-Dec-2019    361    5    52
28-Dec-2019    362    6    52
29-Dec-2019    363    7    1
30-Dec-2019    364    1    1
31-Dec-2019    365    2    1
01-Jan-2020    1      3    1
02-Jan-2020    2      4    1
03-Jan-2020    3      5    1
04-Jan-2020    4      6    1

Редактировать

Я пробовал несколько периодов, включая:

new Date(0) => Thu Jan 01, 1970

и

new Date(0, 0, 0) => Sat Dec 30, 1899 (?!)

Насколько я могу судить, woty меняется в воскресенье. Но dotw сбрасывается до 1 в понедельник. И как кратные 7, они продолжают этот цикл.

Таким образом, лучшее объяснение, по-видимому, состоит в том, что два не связаны , за исключением их 7-дневного смещения цикла на день .

И что начало новой недели

  • в контексте weekdays циклично проходит с понедельника по воскресенье с понедельника = 1
  • в контексте week number in a year (от 1 до 52 или 53) циклы от воскресенья до понедельника с новым номером недели, начинающимся с воскресенья.
...