У меня возникают проблемы с преобразованием даты и времени в правильный часовой пояс. Я не понимаю, почему это работает так.
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>
Информация @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()
раньше.
Date
объект Date
на данный момент, вы явно предложили код, который сказал, что вы передаете строку. d = "Thu Apr 26 2018 21:09:11 GMT-0700 (Pacific Daylight Time)"
однозначно .
Автоматическое определение строк, отличных от 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>