Как разобрать строку времени без смещения, используя момент? - PullRequest
0 голосов
/ 05 октября 2019

У меня есть особый случай использования, когда приложение всегда должно использовать время в America/Chicago часовом поясе. Поэтому я установил часовой пояс по умолчанию для Момента на 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

Есть идеи?

Спасибо

1 Ответ

2 голосов
/ 07 октября 2019

Если вы уже знаете часовой пояс и формат строки - вы можете создать свой собственный 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...