Date.toString и Date.toLocaleDateString несовместимы в Chrome и Firefox?

1

Поэтому я хочу показать дату без особого внимания ко времени суток. С датой также нечего возиться. Я нахожусь на MacBook Pro.

Если я ввожу числа в конструктор Date, появляется следующее ниже.

Например, я хочу показать 28 апреля 1993 года.

var objDate = new Date(1993, 3, 28),
    dateString = objDate.toLocaleDateString(undefined, {
        weekday: "long",
        year: "numeric",
        month: "long",
        day: "numeric",
        hour: "numeric",
        timeZoneName: 'long'
    });

    console.log(dateString)
    //Chrome Outputs: "Wednesday, April 28, 1993, 12 AM Mountain Daylight Time"
    //Firefox Outpus: "Tuesday, April 27, 1993, 6 PM Mountain Daylight Time"

    let nowDate = new Date(1993, 3, 28);
    console.log(nowDate.toString())
    //Chrome Outputs: "Wed Apr 28 1993 00:00:00 GMT-0600 (Mountain Daylight Time)"
    //Firefox Outputs: "Wed Apr 28 1993 00:00:00 GMT+0000 (UTC)"

    console.log(nowDate.toLocaleString())
    //Chrome Outputs: "4/28/1993, 12:00:00 AM"
    //Firefox Outputs: "4/27/1993, 6:00:00 PM"

Итак, теперь даты показывают как 27-е, так и 28-е, хотя я хочу, чтобы он показывал только 28-е.

Но! Если я изменю номера в строковый формат, например, следующий код. Это все еще непоследовательно.

var objDate = new Date("1993-04-28"),
    dateString = objDate.toLocaleDateString(undefined, {
        weekday: "long",
        year: "numeric",
        month: "long",
        day: "numeric",
        hour: "numeric",
        timeZoneName: 'long'
    });

    console.log(dateString)
    //Chrome Outputs: "Wednesday, April 27, 1993, 12 AM Mountain Daylight Time"
    //Firefox Outpus: "Tuesday, April 27, 1993, 6 PM Mountain Daylight Time"

    let nowDate = new Date("1993-04-28");
    console.log(nowDate.toString())
    //Chrome Outputs: "Wed Apr 27 1993 00:00:00 GMT-0600 (Mountain Daylight Time)"
    //Firefox Outputs: "Wed Apr 28 1993 00:00:00 GMT+0000 (UTC)"

    console.log(nowDate.toLocaleString())
    //Chrome Outputs: "4/27/1993, 12:00:00 AM"
    //Firefox Outputs: "4/27/1993, 6:00:00 PM"

Теперь вот последний бит кода.

Если я вводил время дня в строковый формат, например, в полдень, оно оказалось прекрасным, чтобы показать, в какой день он находится.

EDIT: Я просто проверил этот метод в Safari и вывел неверную дату.

var objDate = new Date("1993-04-28 12:00"),
    dateString = objDate.toLocaleDateString(undefined, {
        weekday: "long",
        year: "numeric",
        month: "long",
        day: "numeric",
        hour: "numeric",
        timeZoneName: 'long'
    });

    console.log(dateString)
    //Chrome Outputs: "Wednesday, April 28, 1993, 12 PM Mountain Daylight Time"
    //Firefox Outpus: "Wednesday, April 28, 1993, 6 AM Mountain Daylight Time"

    let nowDate = new Date("1993-04-28");
    console.log(nowDate.toString())
    //Chrome Outputs: "Wed Apr 28 1993 12:00:00 GMT-0600 (Mountain Daylight Time)"
    //Firefox Outputs: "Wed Apr 28 1993 12:00:00 GMT+0000 (UTC)"

    console.log(nowDate.toLocaleString())
    //Chrome Outputs: "4/28/1993, 12:00:00 PM"
    //Firefox Outputs: "4/28/1993, 6:00:00 AM"

Итак, теперь речь идет, в частности, о вопросах.

Почему методы с разными вводами по дате иногда устанавливают другой день? Что делают браузеры по-разному в каждом из перечисленных случаев? Я думал, что каждый из методов, которые я использовал, будет локально, а не основан на UTC.

EDIT: Мне просто нужно использовать одну из библиотек, чтобы справиться со всеми несоответствиями. Хотя есть достаточно небольшая библиотека? Я нашел dayjs, и он выглядит достаточно маленьким.

источники кодирования

  • 1
    Выходные данные Date.prototype.toString стандартизированы по состоянию на ECMAScript 2018, однако ранее они зависели от реализации и широко варьировались между реализациями. Вывод toLocaleString не стандартизирован и все еще в значительной степени зависит от реализации.
Теги:
datetime
browser
date

2 ответа

1
Лучший ответ

Синтаксический анализ строк даты зависит от реализации - это означает, что он не согласован во всех браузерах. Некоторые форматы строк обычно рассматриваются как UTC, а не локальные. Из документов JavaScript Date...

Примечание: синтаксический анализ строк даты с помощью конструктора DateDate.parse, они эквивалентны) настоятельно не рекомендуется из-за различий и несоответствий в браузере. Поддержка строк формата RFC 2822 предоставляется только по соглашению. Поддержка форматов ISO 8601 отличается тем, что строки, содержащие только дату (например, "1970-01-01"), обрабатываются как UTC, а не как локальные.

Аналогично, toString может не создавать одинаково отформатированную строку даты в разных браузерах. Из документов Date.prototype.toString (обратите внимание, что ECMAScript 2018 не был полностью реализован во всех браузерах на дату этого ответа)...

До ECMAScript 2018 (редакция 9) формат строки, возвращаемой Date.prototype.toString, зависел от реализации. Поэтому не следует полагаться на указанный формат.

Кроме toLocaleString locales и options toLocaleString поддерживаются не во всех браузерах.

Как вы заметили, существует много библиотек, таких как Moment.js, которые могут помочь с этим.

Если вы просто пытаетесь принять согласованные входные данные строки даты и переформатировать их для отображения, это может быть не так уж сложно с vanilla js (но сложность во многом зависит от согласованности ваших входных значений). Например:

const formatDate = (date) => {
  const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  let [y, m, d] = date.split('-');
  return months[parseInt(m) - 1] + ' ' + d + ', ' + y;
}

let date = formatDate('1993-04-28');
console.log(date);
// April 28, 1993
0

Да, есть много несоответствий между браузерами. Трое хуже всего на IE и Safari, где new Date("2018-08-23 18:00:00") не является допустимым форматом даты :) Лучший способ, который я нашел, - это преобразовать его в "Зулу" и добавить T для времени, например: new Date("2018-08-23T18:00:00Z")

Просто используйте yourDate.replace(" ", "T"); для добавления T, а затем просто добавьте строку Z

По любому вопросу дайте мне комментарий, спасибо.

  • 0
    2018-08-23 18:00:00 не является форматом даты, как указано в ECMAScript, и поэтому может не работать. Если вообще, вы должны использовать только формат YYYY-MM-DDTHH:mm:ss.sssZ .
  • 1
    Обратите внимание, что предлагаемые вами изменения изменит строку с представления локальной даты и времени на дату и время UTC, что сместит ее между + 14 ч и -10 ч.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню