Проблема, связанная с датой / временем и часовым поясом - PullRequest
1 голос
/ 03 июля 2019

Я создаю серию событий в Календаре Google на основе информации из таблиц Google, связанных с формой Google.Работа с датами - это беспорядок, и я получаю ошибочные результаты.

У меня есть поле в электронной таблице с начальной датой, показанной как YYYY/MM/DD
У меня есть поле с начальным временем, показанным как HH:mm
У меня есть поле с окончанием ВРЕМЯ, показанное как HH:mm

Я понимаю, что внутренне время связано с годом / месяцем / днем, и у ДАТЫ также есть время, связанное, которые не показаны.

В конечном итоге мне нужно будет создать серию событий календаря, используя часть DATE из DATE и часть TIME от времени, которое я могу изменить, используя методы setHours() setMinutes().

Теперь моя проблема заключается в создании согласованного объекта Date из значения ячейки DATE, которое, как кажется, странно меняется.

var ssTZ = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var SSDate = ss.getRange(6,8).getValue();
var dataStart = Utilities.formatDate(SSDate, 'America/Brasilia' , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartTZ = Utilities.formatDate(SSDate, ssTZ , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartSP = Utilities.formatDate(SSDate, 'America/Sao_Paulo' , 'MMMM dd, yyyy 12:00:00 Z');
var dataStartOS = Utilities.formatDate(SSDate, 'GMT-3' , 'MMMM dd, yyyy 12:00:00 Z');

var date = new Date(dataStart);
var dateTZ = new Date(dataStartTZ);
var dateSP = new Date(dataStartSP);
var dateOS = new Date(dataStartOS);  

Logger.log("Spreadsheet TimeZone: " + ssTZ);
Logger.log(SSDate);
Logger.log("");
Logger.log(date);  
Logger.log(dateTZ);
Logger.log(dateSP);
Logger.log(dateOS);

Этот код создает следующие выходные данные журнала:

[19-07-02 20: 39: 49: 780 BRT] Электронная таблица TimeZone: Америка / Sao_Paulo
[19-07-02 20: 39: 49: 781 BRT] Вт 12 января 00:00:00 GMT-02: 00 2016
[19-07-02 20: 39: 49: 782 BRT]
[19-07-02 20: 39: 49: 784 BRT] Вт 12 января 10: 00: 00 GMT-02: 00 2016
[19-07-02 20: 39: 49: 784 BRT] Вт 12 января 12:00:00 GMT-02: 00 2016
[19-07-02 20: 39: 49: 785 BRT] Вт 12 января 12:00:00 GMT-02: 00 2016
[19-07-02 20: 39: 49: 786 BRT] Понедельник 11 января 13:00:00GMT-02: 00 2016

, которые не имеют смысла, поскольку все используемые часовые пояса должны фактически быть одинаковыми.

EDIT .... Addedinfo

По запросу @TheMaster журналы от переменных в формате Text:

  Logger.log(dataStart);  
  Logger.log(dataStartTZ);
  Logger.log(dataStartSP);
  Logger.log(dataStartOS);

[19-07-03 12: 39: 33: 099 BRT] 12 января 2016 г. 12:00:00 + 0000

[19-07-03 12: 39: 33: 100 BRT] 12 января 2016 г. 12:00:00 -0200

[19-07-03 12:39: 33: 100 BRT] 12 января 2016 г. 12:00:00 -0200

[19-07-03 12: 39: 33: 100 BRT] 11 января 2016 г. 12:00:00 -0300

Первые 3 выхода, как объясняет @ziganotscha, связаны с изменением летнего времени на GMT-2, и Америка / Бразилиа не распознается как действительный часовой пояс.

Я все еще удивленпочему он меняется на 11 января, когда GMT-3обозначается как Часовой пояс.

Кроме того, если я создаю объект Date непосредственно из значения ячейки без форматирования, я получаю другое время:

var rawDate = new Date(SSDate);

19-07-03 12:39: 33: 101 BRT] rawDate: вт 12 января 2016 00:00:00 GMT-0200 (BRST)

Я ненавижу иметь дело с датами ... так запутанно ...

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Существует путаница с часовыми поясами:

Ваш часовой пояс - это часовой пояс 'America/Sao_Paulo' - вот почему Logger.log(dateTZ); и Logger.log(dateSP); дают вам то же время - как вы ожидаете.

Однако имейте в виду, что в январе Сан-Паулу соблюдает Летнее время в Бразилиа (UTC−02 вместо UTC−03), в этом и заключается разница между Logger.log(dateSP); и Logger.log(dateOS);.

https://www.timeanddate.com/time/zones/brt

Что касается dataStart - вы назначаете ему часовой пояс 'America/Brasilia', который не является определенным именем для часового пояса. Вот почему Apps Script не принимает значение и предоставляет вам UTC+0 часовой пояс.

Вы можете проверить, что formatDate () использует часовой пояс, как указано Java SimpleDateFormat: https://developers.google.com/apps-script/reference/utilities/utilities http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

И java использует базу данных часовых поясов Олсона.

https://www.oracle.com/technetwork/java/javase/dst-faq-138158.html#worldwide https://en.wikipedia.org/wiki/Time_in_Brazil

0 голосов
/ 03 июля 2019

Итак, время электронной таблицы SSDate равно

Вт 12 января 00:00:00 GMT-02: 00 2016

, т. Е. 12 января начало в полночьв часовом поясе - 2 часа с GMT.

'America/Brasilia' не является действительным часовым поясом и может игнорироваться.

Оба, America/Sao_Paulo и ssTZ в качестве второго аргумента Utilities.formatDate()выдает ту же действительную дату

12 января 2016 г. 00:00:00 -0200

Когда смещение составляет GMT-3, оно составляет -3 часа с полуночи по Гринвичуили -1 час из часового пояса GMT-2, дата:

11 января 2016 г. 23:00:00 -0300

, т. е. 23:00 предыдущего дня.

Проблема:

В ваших журналах игнорируется часть времени, поскольку вы указали статический формат времени для всех дат 12:00:00 Z вместо HH:mm:ss.

Так, например, последняя дата, отформатированная в GMT-3, становится

11 января 2016 г. 12:00:00 -0300

Вызовновая функция Date () изменяет вышеуказанный объект на местное время GMT-2 (+ 1 с GMT-3):

Пн 11 января 13:00:00 GMT-02: 00 2016

Обратите внимание, что синтаксический анализ с использованием new Date(timestring) настоятельно не рекомендуется.

Ссылки:

...