Как получитьValue () на дату с правильным TimeZone? - PullRequest
0 голосов
/ 14 марта 2019

Кто-то из часового пояса "Европа / Лондон" (UTC + 0) создал электронную таблицу.Они вводят дату «22 марта 2019 года» в одно из полей.Это представляет дату 3/22/2019 0:00 UTC+O.

Я нахожусь в часовом поясе "America / Los_Angeles" (UTC-7).Когда я запускаю скрипт Google Apps и пытаюсь получить значение, оно оценивается следующим образом:

Thu Mar 21 17:00:00 GMT-07:00 2019

Это точно, поскольку 3/22/2019 0:00 UTC+O == 3/21/2019 17:00 UTC-7.

Проблема заключается в том, чтоЯ пытаюсь получить дату программно, я получу ее как 21 вместо 22.

Например, если я попытаюсь запустить:

cellRange.getValue().getDate() // returns 21 even though the sheet shows the date as 22

Это потому, что getDate() возвращает значения «по местному времени».Время локального сценария - UTC-7, следовательно, оно возвращает 21.

Однако это вызывает диссонанс:

  • Дата электронной таблицы: 22 (то есть значение, которое я вижу на листе)
  • Программная дата: 21 (т. Е. Значение, возвращаемое getDate() выше)

Это проблематично, когда я пытаюсь использовать такую ​​функцию, как joinDateAndTime_() с "22 марта 2019 года" в качестве даты и 6 утра в качестве времени, например.Это приводит к тому, что вместо «22 марта 2019 6:00 UTC-7» создается дата «21 марта 2019 г. 6:00 UTC-7».

Какое здесь лучшее решение?

1 Ответ

0 голосов
/ 14 марта 2019

Не полное решение (скоро обновлю)

Кажется, вот что происходит:

  1. Значение жестко закодировано как «22 марта» (текст).
  2. Когда пользователь открывает лист, независимо от того, в каком часовом поясе он находится, он предполагает, что он представляет 22 марта в часовом поясе листа. 3/22/2019 0:00 UTC+0
  3. Как только вы прочитаете значение в JavaScript Date, все функции даты предполагают, что вы хотите его получить в текущем часовом поясе (он же сценарий). 3/21/2019 17:00 UTC-7

Решение A: Просто добавьте часы

Забудьте о часовых поясах. Вместо жесткого кодирования часов в Date, просто сместите дату на нужные вам часы.

Единственным недостатком является то, что вы должны быть уверены, что дата началась в 0:00 в зависимости от того, в каком часовом поясе она находилась. часы неправильно.)

Решение B: по математике

Я обновлю это в ближайшее время, но в конечном итоге вам может понадобиться функция sheetTimezoneOffset(), которая может использоваться следующим образом:

function getDate(cellRange) {
    var date = cellRange.getValue().getDate();
    var extraneousHours = formatDate(date, "h", sheetTimezoneOffset());
    date = date.addHours(-extraneousHours);
    var offsetHours = 6; // e.g. for 6am
    date.addHours(offsetHours);
    return date;
}
...