Действительно, в соответствии со страницей 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>