В общем, вы должны кодировать не для конкретного браузера, а в соответствии со стандартами.В этом случае стандартом является ECMAScript (ECMA-262). Раздел 20.3.4.41 охватывает Date.prototype.toString()
, что относится к следующему разделу, описывающему внутреннюю функцию ToDateString(tv)
, в котором объясняется:
Возвращает зависящее от реализации строковое значение, которое представляетtv как дата и время в текущем часовом поясе, используя удобную, удобочитаемую форму.
Под «зависимой от реализации» это означает, что фактическое строковое значение не определено спецификацией,и может варьироваться от одной реализации к другой.Вам не гарантируется тот же результат от одного браузера к другому, или от одной версии браузера к другому, или даже от одной операционной системы к другой от той же версии того же браузера.
By«человекочитаемая форма», это означает, что произведенная ценность подходит для показа человеку.Это не гарантирует, что это значение будет представлено способом, который может быть последовательно проанализирован компьютерным кодом.
Таким образом, если вы намереваетесь отправить строковое значение в другой код, вы не должны использовать .toString()
,Как правило, для этой цели вы должны предпочесть строку в формате ISO 8601.Используйте .toISOString()
, если хотите получить результат в терминах UTC.Обратитесь к этому ответу (или используйте библиотеку), если вы хотите получить результат в терминах местного времени, включая смещение часового пояса.
Относительно того, почему вещи изменились между Chrome 66 и Chrome 67 -У меня нет точных данных, но я предполагаю, что Chrome переключился с использования IANA TZDB сокращений на использование CLDR названий часовых поясов, вероятно, благодаря использованию ICU ,Это разумно, и это то, что делают многие другие реализации.Однако нет необходимости использовать один набор данных или другой, поэтому не полагайтесь на такие вещи.