Не удается преобразовать момент и часовой пояс в местное время

Это гибридное приложение на основе Ionic на NodeJS.

Попытка преобразовать местное время, указанное пользователем, в другой часовой пояс, но это не удается:

static MTL_local_time_to_server(aDateTime:moment.Moment):moment.Moment{
    console.log(aDateTime.format('MMMM Do YYYY, h:mm:ss a'));

    const localTime:moment.Moment = momenttz.tz(aDateTime, momenttz.tz.guess());
    console.log(localTime.format('MMMM Do YYYY, h:mm:ss a'), momenttz.tz.guess());
    const returnTime:moment.Moment = momenttz(localTime).tz("Europe/Berlin");
    console.log(returnTime.format('MMMM Do YYYY, h:mm:ss a'));
    return returnTime;
}

Отпечатки

April 22nd 2019, 12:00:00 am 
April 22nd 2019, 12:00:00 am America/Los_Angeles 
April 22nd 2019, 9:00:00 am

person El Dude    schedule 22.04.2019    source источник
comment
Вероятно, связано с этим вопросом, если localDateTime заканчивается на Z действительно будет рассматриваться как UTC и преобразовано только с помощью moment.tz(input, zone)< /я>. См. связанный принятый ответ и его комментарии для получения дополнительной информации.   -  person VincenzoC    schedule 22.04.2019
comment
@VincenzoC Спасибо за ваше предложение, но удалить Z по-прежнему не удается, см. выше.   -  person El Dude    schedule 22.04.2019


Ответы (1)


Несколько вещей:

  • Вы ввели вывод moment.tz как string, но на самом деле это объект Moment.

  • Когда вы вызываете JSON.stringify для объекта Moment, он возвращает результат .toISOString(), который всегда в формате UTC. (Z указывает UTC в формате ISO 8601.)

  • Неясно, является ли ваш ввод объектом string или Date. Если это string, то Z указывает на UTC, поэтому он всегда будет интерпретироваться как UTC. Если это объект Date, то будет использоваться момент времени, представленный этим объектом Date, что зависит от того, как вы сконструировали объект Date. В любом случае, значение, которое вы показываете, основано на UTC, а не на местном времени.

  • Не совсем понятно, чего вы пытаетесь достичь. Из ваших имен переменных может показаться, что вы пытаетесь преобразовать localDateTime в localTime, что логически дало бы одно и то же значение, если бы они оба были «локальными».

    • Если вы пытаетесь преобразовать значение из местного времени в берлинское, то:

      moment(yourInput).tz('Europe/Berlin')
      
    • Если вы пытаетесь преобразовать значение из времени Лос-Анджелеса в время Берлина, то:

      moment.tz(yourInput, 'America/Los_Angeles').tz('Europe/Berlin')
      
    • Если вы пытаетесь преобразовать значение из UTC в местное время, вам вообще не нужен момент-часовой пояс:

      moment.utc(yourInput).local()
      
  • Если вам нужны строковые выходные данные, вы должны вызвать функцию format для создания строки. То, что вы здесь показали, выглядит так, как будто вы записываете объекты Moment, а не строки.

person Matt Johnson-Pint    schedule 22.04.2019
comment
Спасибо за указатели, я проверю это. В моей среде IDE moment.tz, кажется, возвращает any, а не определенный тип. Следовательно, я потерялся. Я попробую ваши предложения. - person El Dude; 22.04.2019
comment
Да, но я импортировал только moment-timezone, а не moment для типов. - person El Dude; 23.04.2019
comment
Вы также можете рассмотреть возможность использования Luxon вместо Moment. Он включает поддержку часовых поясов и предназначен для современного рабочего процесса разработки. - person Matt Johnson-Pint; 23.04.2019
comment
Я отредактировал свой вопрос, чтобы сделать его более ясным. По сути, выполняя двойное преобразование, которое вы перечисляете. - person El Dude; 23.04.2019
comment
Я вижу правку, но все еще неясно, чего вы пытаетесь добиться. Вы говорите местное время, указанное пользователем, но вы предоставляете объект момента в качестве ввода. Как вы построили этот объект? полный пример будет очень полезен для вас. - person Matt Johnson-Pint; 23.04.2019
comment
Кроме того, что со всеми предположениями tz? Кажется, вы запускаете это на сервере в node.js? Если это так, вы вообще не должны работать с местным временем. Часовой пояс сервера ни для кого не является локальным. - person Matt Johnson-Pint; 23.04.2019
comment
Запуск гибридного приложения на основе ионов в nodejs. Часовой пояс ввода пользователя зависит от местоположения пользователя. Этот код есть на телефоне. Добавлено для редактирования. - person El Dude; 23.04.2019
comment
Спасибо за разъяснение, это немного помогает. Пока неясно, что вы хотите, чтобы momenttz.tz(aDateTime, momenttz.tz.guess()) сделал. Если вы построили aDateTime с помощью чего-то вроде moment(userInput), то это уже по местному времени. Кроме того, что не так с выводом? Полночь 2 апреля в Лос-Анджелесе — это действительно 9 утра в Берлине. (В этот день в Берлине — UTC+2, а в Лос-Анджелесе — UTC-7, так что разница составляет 9 часов.) - person Matt Johnson-Pint; 23.04.2019
comment
Ты прав. 12 часов ночи. Проклятое обозначение AM/PM (здесь говорят европейцы: D). Спасибо за помощь. Думаю, теперь я нашел решение. - person El Dude; 23.04.2019