Дата Google Script показывает неправильные часы

Я чувствую, что изучил почти всю документацию, касающуюся дат в JS и GAS. Особенно в отношении вопросов перехода на летнее время. Так как у меня не было такой проблемы до смены летнего времени. Я думаю, что мне не хватает чего-то простого. Проблема в том, что, несмотря на возню со всеми настройками, часы на моей дате, выводимой из утилиты форматирования, по-прежнему неверны. Ниже приведен снимок экрана отладчика и фрагмент кода, который я запускаю. Меня интересует значение «дата». Он создается внутри скрипта в строке 53.

var date = new Date(); //line 53
date = Utilities.formatDate(date, "Chicago/America", "MM/dd/yyyy HH:mm:ss zzzz"); //line 61

Я базируюсь в КС. (центральное время или UTC-06:00 или что-то еще).

У меня такое чувство, что это будет момент для меня, ну да ладно! Спасибо за любую помощь!

Вывод отладки


person jkmayne    schedule 13.03.2013    source источник


Ответы (1)


то, что я обычно использую без каких-либо проблем, это просто:

  var FUS1=new Date(dateObject).toString().substr(25,6)+":00";// get the timeZone part of the string coming from the date you are working on (an event)
  dateString = Utilities.formatDate(dateObject, FUS1, "MM/dd/yyyy HH:mm:ss");// use it in formatDate and it will have the right value for every season...

обратите внимание, что вы использовали date 2 раза в своем примере кода: один раз как результат строки и один раз как объект даты в той же строке...

Изменить после вашего комментария:

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

  var date = SpreadsheetApp.getActiveSheet().getRange('A2').getValue();
  var FUS1=new Date(date).toString().substr(25,6)+":00";
  dateString = Utilities.formatDate(date, FUS1, "MM/dd/yyyy HH:mm:ss");
person Serge insas    schedule 13.03.2013
comment
Хм. Итак, в первой строке как вы определили dateObject? - person jkmayne; 14.03.2013
comment
извините, я не видел вашего комментария... Я назвал его dateObject, чтобы указать разницу по сравнению с dateString, он может исходить из события календаря, ячейки электронной таблицы или чего-то еще... Когда вы используете новую дату(), вы создаете дату объект, если вы используете утилиты.formatDate.... вы получите строку даты. вы не можете сделать то же самое с каждым из них. Когда вам нужно записать дату в электронную таблицу, вы должны использовать объект даты и позволить электронной таблице отображать ее так, как вы хотите. Строка не очень полезна, поскольку вы можете только отображать ее... Не могли бы вы дать больше информации о том, для чего вы ее используете? - person Serge insas; 14.03.2013
comment
Хм, ладно, кажется, теперь я понял. var date = new Date(); //creates new date object var datestring = Utilities.formatDate(date,"Chicago/America", "MM/dd/yyyy HH:mm:ss"); //returns date-string Мой вывод, однако, по-прежнему и неправильно отформатирован в строке даты, а объект даты не учитывает изменение летнего времени при использовании двух вышеуказанных строк. Я вижу: date = Thu 14 Mar 2013 12:19:27 GMT-6:00 (CST) datestring = 14.03.2013 18:19:27 //wth с 18 часами?? – - person jkmayne; 14.03.2013
comment
Что касается дополнительной информации, сам сценарий используется для получения отметки времени последней отправки в форме. У меня были очень странные даты, поэтому я тестировал и наткнулся на это. Большая проблема заключается в том, что я использую метод formatDate, чтобы попытаться отформатировать обычную строку. Мне просто нужно отформатировать строку, как и любую другую. - person jkmayne; 14.03.2013
comment
хммм, ну, на самом деле, теперь, когда я попробовал несколько других вещей, кажется, что когда я использую getValue(), чтобы получить отметку времени из электронной таблицы, он действительно возвращает dateObject.... Так что теперь я думаю, что метод formatDate() виноват в перепутанных строках даты. - person jkmayne; 14.03.2013
comment
Нет, я не думаю, что это работает. Первая строка возвращает объект диапазона, который передается методу new Date() и методу formatDate(), ни один из них не является допустимым аргументом для функций. - person jkmayne; 14.03.2013
comment
извините, это была опечатка, я забыл getValue() - person Serge insas; 14.03.2013
comment
рад что помог и спасибо! Кстати, помните об этом трюке с FUS1, так как он, вероятно, вам очень поможет ;-), он помогает мне... - person Serge insas; 15.03.2013
comment
@Sergeinsas Что на самом деле означает FUS1? Это похоже на способ определить часовой пояс пользователя в браузере, если значение поля даты запускается через обработчик сервера, не так ли? - person Bryan P; 17.03.2013
comment
в некотором роде... это способ получить часовой пояс события, а не часовой пояс пользователя. Это в основном полезно при работе с событиями календаря и переходом на летнее время (иногда событие tz и пользователь tz не совпадают из-за перехода на летнее время). - person Serge insas; 17.03.2013