Как использовать момент-tz.js, чтобы разобрать tz как "GMT-08: 00" - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь запустить этот JS

return function(milliSeconds, timeZoneId) {
    if (milliSeconds == 0) {
        return "";
    }
    var now = moment();

    return now.tz(timeZoneIdm, milliSeconds).format('MMM d, yyyy H:mm:ss'); 
}

Например, с этим вводом:

milliSeconds = "1524578400000"

timezoneId = "GMT-08:00"

сбой при разборе "GMT-08:00". В любом случае я могу настроить его на работу?

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Я работаю над похожей темой и получил ответ на ваш оригинальный вопрос. Надежда поможет другим людям, если вам будет слишком поздно.

Прежде всего, как объяснил @VincenzoC: 1. Необходимо изменить временную метку Unix на 10-значный для Moment.JS. 2. Формат года должен быть «ГГГГ» вместо «ГГГГ».

По объяснению здесь введите описание ссылки здесь Совместимость с POSIX требует, чтобы смещения были инвертированы. Следовательно, Etc / GMT-X будет иметь смещение + X, а Etc / GMT + X будет иметь смещение -X. Это результат базы данных часовых поясов IANA, а не произвольный выбор Moment.js.

Вам нужно изменить набор на: var timezoneId = "Etc / GMT + 08"; Тогда беги Момент

Возвращение: «2 апреля 2018 6:00:00 -08: 00» Пожалуйста, обратите внимание, что вы ожидаете 5 утра, но это дневное время, поэтому возвращение 6 утра, что правильно.

0 голосов
/ 29 апреля 2018

Как moment.tz(..., String) документы:

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

A идентификатор часового пояса - это что-то вроде 'America/New_York' или 'Europe/Rome', "GMT-08:00" - недопустимый ввод.

В вашем случае вы можете использовать moment(Number), а затем:

  • преобразование в заданную зону с использованием функции tz()
  • или установить смещение с помощью utcOffset(String)

var milliSeconds = "1524578400000";
var timezoneId = "GMT-08:00";

var timeInt = parseInt(milliSeconds, 10)
var m1 = moment(timeInt).tz('America/Los_Angeles');
console.log(m1.format('MMM D, YYYY H:mm:ss'));

var offset = timezoneId.substring(3);
var m2 = moment(timeInt).utcOffset(offset);
console.log(m2.format('MMM D, YYYY H:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.14/moment-timezone-with-data-2012-2022.min.js"></script>

Обратите внимание, что:

  • момент форматирование токены чувствительны к регистру, поэтому вы должны использовать YYYY для лет и D для дня месяца (d - день недели)
  • 1524578400000 - это 2018-04-24 14:00:00 UTC, мне не хватает, почему вы ожидаете 5am в качестве вывода.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...