Скрипты приложений new Date и getTime работают не так, как в браузере

В моей консоли браузера я могу анализировать даты и получать их время в миллисекундах:

new Date('2018-10-16 12:41:50.000000');
// => Tue Oct 16 2018 12:41:50 GMT+0200 (Central European Summer Time)
new Date('2018-10-16 12:41:50.000000').getTime();
// => 1539686510000

Если я сделаю то же самое в сценариях приложений, дата не будет распознана (по умолчанию - начало эпохи 1970 года), и getTime() просто сломается (NaN):

function test_date() {
  Logger.log('new Date(date)');
  Logger.log(new Date('2018-10-16 12:41:50.000000'));
  Logger.log('getTime()');
  Logger.log(new Date('2018-10-16 12:41:50.000000').getTime());
}

Скрипты приложений new Date и getTime работают не так, как в браузере
Скрипты приложений new Date и getTime работают не так, как в браузере

Я что-то упускаю или new Date() / getTime() просто не работает в сценариях приложений?

Я запускаю приведенный выше скрипт в Google Sheet

Будьте очень осторожны, анализируя даты с не указанным часовым поясом. Я видел, как Chrome принимает местный часовой пояс устройства, а сафари форсирует UTC. Ночной кошмар. Если вы не знаете часовой пояс, безопаснее всего принудительно выполнить сериализацию и десериализацию UTC, по крайней мере, так вы получите согласованное поведение и ваши даты не будут увеличиваться волшебным образом.

bbsimonbb 19.10.2018 10:12

Возможный дубликат Почему мой объект Date в скрипте Google Apps возвращает NaN

Rubén 19.10.2018 18:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
909
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо этого

  Logger.log(new Date('2018-10-16 12:41:50.000000').getTime());

использовать этот

  Logger.log((new Date('2018-10-16 12:41:50.000000')).getTime());
Ответ принят как подходящий

Скрипт Google Apps использует RFC3339. Таким образом, 2018-10-16 12:41:50.000000 не может быть проанализирован напрямую с помощью new Date('2018-10-16 12:41:50.000000'). Таким образом, new Date('2018-10-16 12:41:50.000000') совпадает с new Date(''), и оба результата превращаются в Thu Jan 01 01:00:00 GMT+01:00 1970. Чтобы проанализировать дату, как насчет изменения формата RFC3339?

Из:

Logger.log(new Date('2018-10-16 12:41:50.000000'));
Logger.log(new Date('2018-10-16 12:41:50.000000').getTime());

К:

Logger.log(new Date('2018-10-16T12:41:50.000Z'));
Logger.log(new Date('2018-10-16T12:41:50.000Z').getTime());

Результат:

Tue Oct 16 12:41:50 GMT+02:00 2018
1.53968651E12

Примечание:

  • В вашем случае в Google Apps Script часовой пояс скрипта отражается в результате. Часовой пояс для этой ситуации можно увидеть в редакторе скриптов.
    • В редакторе скриптов.
      • Файл -> Свойства проекта -> Информация -> Часовой пояс
    • Вы также можете подтвердить это с помощью Logger.log(Session.getScriptTimeZone()) скрипта.
  • new Date('2018-10-16T12:41:50') также можно разобрать.

Использованная литература:

Если это было не то, что вам нужно, извините.

Am I missing something or are new Date() / getTime() simply broken in App Scripts?

На данный момент движки Google Apps Script и JavaScript в Chrome не совпадают. С другой стороны, каждый из них выполняет сценарии в разных контекстах, поскольку сценарий Google Apps запускает сценарии на серверах Google, а Chrome запускает сценарии на компьютере пользователя.

Я делаю акцент на «сейчас», потому что на Google I / O 2018 было объявлено, что скрипт Google Apps будет работать на V8.

Связанный

Другие вопросы по теме