Date.toString и Date.toLocaleDateString несовместимы в Chrome и Firefox? - PullRequest
0 голосов
/ 25 октября 2018

Итак, я хочу отобразить дату без особого внимания ко времени суток.С датой тоже ничего не мешает.У меня 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"

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

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

РЕДАКТИРОВАТЬ: Я только что проверил этот метод в 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.

РЕДАКТИРОВАТЬ: Возможно, мне просто нужноиспользуйте одну из библиотек только для обработки всех несоответствий.Хотя есть достаточно небольшая библиотека?Я нашел Dayjs, и он выглядит достаточно маленьким.

codepen sources

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

Примечание: синтаксический анализ строк даты с конструктором 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 не поддерживаются во всех браузерах .

Как вы заметили, есть много библиотек, таких как 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[m - 1] + ' ' + d + ', ' + y;
}

let date = formatDate('1993-04-28');
console.log(date);
// April 28, 1993
0 голосов
/ 25 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...