Неверный формат даты в Firefox: сервер rails и клиент angularJS - PullRequest
0 голосов
/ 28 мая 2018

Я получаю несколько метаданных с сервера rails, которые имеют атрибут даты и времени на картинке телефона.Я хочу показать эту дату в местном формате с помощью angularJS, вот что я получил от рельсов в качестве примера:

2018-05-09 09:46:33 UTC

Это код на стороне angularJS:

getDateTimeOriginal: =>
      if @metadata? and @metadata.date_time_original?
        dateTime = new Date(@metadata.date_time_original)
        moment(dateTime).format('DD-MMM-YYYY h:mm A')

он отлично работает в Chrome, но в Firefox у меня недопустимая дата!

1 Ответ

0 голосов
/ 28 мая 2018

Действительно, в соответствии со страницей MDN в Date , разбирать строки даты через конструктор даты или анализ даты следует избегать:

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

И так как ваш формат даты и времени не ISO8601совместимый , вы столкнетесь с такой же проблемой, если попытаетесь напрямую указать строку даты и времени.


По моему мнению, вам следует проанализировать строку даты с моментом (используйте метод parse + укажите формат).Будьте осторожны и используйте moment.utc, так как у вас есть время по Гринвичу.Затем вы можете вернуть JS Date (локальную дату) и использовать методы toLocale...:

Это может дать что-то вроде (я перевожу ваш код coffeescript в обычный Javascript/ Ecmascript, чтобы оно могло быть более полезным для людей, которые встречают этот ответ):

function localizedDatetime(datetime_original, locale) {
  let parsedDatetime = moment.utc(datetime_original, 'YYYY-MM-DD HH:mm:ss Z');
  return parsedDatetime.toDate().toLocaleString(locale);
}

const input = '2018-05-09 09:46:33 UTC';
const fr = localizedDatetime('2018-05-09 09:46:33 UTC', 'fr-FR');
const en = localizedDatetime('2018-05-09 09:46:33 UTC', 'en-US');

console.log("Input: ", input);
console.log(">> FR:", fr);
console.log(">> EN:", en);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment-with-locales.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...