Как разобрать строку времени без смещения с помощью Moment?

У меня есть особый случай использования, когда приложение всегда должно использовать время в часовом поясе America/Chicago. Поэтому я установил часовой пояс Moment по умолчанию на moment.tz.setDefault("America/Chicago");.

С этой настройкой я отправляю все входные данные даты и времени с клиента на сервер в часовом поясе America/Chicago в формате js MM/DD/YYYY h:mm A. И всякий раз, когда клиент запрашивает поле времени, сервер возвращает время в часовом поясе America/Chicago и в том же формате.

Теперь есть случай, когда мне нужно проанализировать это значение даты и времени, возвращаемое сервером, и сравнить его с текущим America/Chicago временем. Я пробовал это,

moment.tz.setDefault("America/Chicago");

let now = moment();

// serverResponse is America/Chicago datetime string in format MM/DD/YYYY h:mm A

let serverResponseMoment = moment(serverResponse);

// The above statement is where I am facing issue. Since the users could be from
// anywhere, moment(serverResponse) will be assuming the serverResponse string to
// be of the local timezone as there is no offset part attached to the string.

return now.isBefore(serverResponseMoment);

Также пробовал

let serverResponseMoment = moment.tz(serverResponse,"America/Chicago");

// The above statement assumes the serverResponse to be in UTC and give me an "America/Chicago"
// date-time after conversion

Я также пробовал moment.utc(serverResponse). Весь синтаксический анализ терпит неудачу, когда выполняется последняя проверка условия.

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

Или какое-то утверждение, которое делает это

Hey Moment, serverResponse is already in "America/Chicago" timezone, you don't have to make any sort of timezone assumptions. Just parse it and return an instance of yourself

Любые идеи?

Спасибо


person Kalesh Kaladharan    schedule 05.10.2019    source источник
comment
Какая версия moment.js? Вы используете moment-timezone.js?   -  person fen1x    schedule 07.10.2019
comment
@ fen1x Я использую момент-часовой пояс: ^ 0.5.21, который установил момент 2.24 в качестве зависимости.   -  person Kalesh Kaladharan    schedule 07.10.2019


Ответы (1)


Если вы уже знаете часовой пояс и формат строки, вы можете создать свой собственный парсер serverResponse:

const momentParserFactory = (format, tz) => (str) => moment.tz(str, format, tz);
const chicagoMoment = momentParserFactory('MM/DD/YYYY h:mm A', 'America/Chicago');

let now = moment();
let serverResponse_1 = '10/07/2019 11:40 AM';
let serverResponseMoment_1 = chicagoMoment(serverResponse_1);

console.log(`"Now" is: ${now.format()}`)
console.log(`Server response date 1: ${serverResponseMoment_1.format()}`);
console.log(`"Now" is before server response date 1: ${now.isBefore(serverResponseMoment_1)}`);

let serverResponse_2 = '10/09/2020 4:20 AM';
let serverResponseMoment_2 = chicagoMoment(serverResponse_2);

console.log(`Server response date 2: ${serverResponseMoment_2.format()}`);
console.log(`"Now" is before server response date 2: ${now.isBefore(serverResponseMoment_2)}`);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.26/moment-timezone-with-data.min.js"></script>

person fen1x    schedule 07.10.2019
comment
Это именно то, что я хотел moment.tz("10/07/2019 11:40 AM",'MM/DD/YYYY h:mm A', 'America/Chicago'). Мне нужно было решить это вчера. Поэтому я переписал серверную часть, чтобы отправлять время в формате RFC. Таким образом, часовой пояс уже есть в строке ввода момента, и, таким образом, все мои предупреждения и ошибки были исправлены, даже если мне пришлось проделать дополнительную работу :) Спасибо. - person Kalesh Kaladharan; 07.10.2019