Moment.js Часовой пояс не конвертируется, если я не укажу дату

1

У меня возникают проблемы с преобразованием даты и времени в правильный часовой пояс. Я не понимаю, почему это работает так.

d = "Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)"

moment.tz(d.toString(), this._timezone).format('MM/DD/YYYY h a')

возвращается 04/26/2018 3 pm

moment.tz(d, this._timezone).format('MM/DD/YYYY h a')

возвращается 04/26/2018 10 pm

Также moment.isMoment(d) возвращает false

также, если я конвертирую d в строку ISO перед настройкой TZ, TZ не регулирует

var d = "Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)";

console.log(moment.tz(d.toString(), 'America/Chicago').format('MM/DD/YYYY h a'));

console.log(moment.tz(d, 'America/Chicago').format('MM/DD/YYYY h a'));

console.log(moment.isMoment(d));
<script src="/moment-with-locales.js"></script>
<script src="/moment-timezone-with-data.js"></script>
  • 0
    ввод даты в виде строки Что не так с этим ?
  • 0
    когда я передаю toString, я получаю предупреждение об устаревании «Предоставленное значение не в распознанном формате RFC2822 или ISO»
Показать ещё 1 комментарий
Теги:
momentjs

2 ответа

0

Информация @Rajits верна, но это не было причиной "странного" поведения.

хотя Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)" выглядит как строка, на самом деле это экземпляр объекта даты javascript. new Date() Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)" UTC, в результате чего эта строка поэтому при передаче экземпляра даты непосредственно к моменту его можно было бы обработать, но когда он превратился в строку с помощью toString() она была заменена простой строкой.

Кроме того, вызывая new Date() в метке времени UTC, она автоматически преобразует эту метку времени в локальный часовой пояс браузеров (клиентов). Поэтому, если вы хотите изменить свою временную метку в произвольном часовом поясе, обязательно не называть new Date() раньше.

  • 0
    Хотя я подозревал, что вы получите описанное вами поведение, если Date объект Date на данный момент, вы явно предложили код, который сказал, что вы передаете строку. d = "Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)" однозначно .
0

Автоматическое определение строк, отличных от ISO, устарело. См. Здесь для получения дополнительной информации. Основной момент:

Это предупреждение об отказе бросается, когда неизвестный формат не найден для даты, переданной в конструктор строк. Чтобы обойти эту проблему, укажите формат для строки, передаваемой в момент().

Поэтому, если вы хотите достоверно проанализировать данную строку, вам нужно будет указать формат во время разбора следующим образом:

moment.tz(d, '<format here>', this._timezone);

Я не уверен, как правильно отформатировать дату всего, но что-то вроде этого должно работать:

var DATE_FORMAT = 'ddd MMM DD YYYY HH:mm:ss [GMT]Z'

var d = "Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)";
var DATE_FORMAT = "ddd MMM DD YYYY HH:mm:ss [GMT]Z"

console.log(moment.tz(d.toString(), DATE_FORMAT, 'America/Chicago').format('MM/DD/YYYY h a'));

console.log(moment.tz(d, DATE_FORMAT, 'America/Chicago').format('MM/DD/YYYY h a'));

console.log(moment.isMoment(d));
<script src="/moment-with-locales.js"></script>
<script src="/moment-timezone-with-data.js"></script>

Ещё вопросы

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