Позволить пользователю ввести дни и время в любом часовом поясе и убедиться, что они преобразованы из часового пояса, используемого в UTC для хранения базы данных? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть пользователь, который вводит информацию для запроса, включая день, время начала и время окончания.

Все эти даты и время вводятся в часовом поясе, который может меняться от запроса к запросу.

Мне нужно убедиться, что я правильно преобразовываю дату и время из часового пояса текущих запросов в UTC, прежде чем сохранять это в базе данных.

Эти значения вводятся во внешнем интерфейсе (Vue. js) и пересылается через запрос API к бэкэнду (PHP / Laravel) в виде отформатированной строки через moment.js, также используя момент-часовой пояс.

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

Из документов о часовых поясах я вижу, что могу сделать что-то вроде: moment.tz(myDateString, myTimeZone); до "Форматировать даты в любом часовом поясе"

Итак, у меня естьдата / время 2019-10-22 10:00 AM и текущий часовой пояс America/New_York.

Я надеялся, что выполнение var startTime = moment.tz('2019-10-22 10:00 AM', 'America/New_York') настроит меня на то, чтобы я мог просто сделать startTime.clone().utc().toISOString(), что дало бы мне 2019-10-22 10:00am 'Америка /New_York 'в UTCно, похоже, он выключен.

Я надеялся, что моя начальная дата будет выглядеть как 2019-10-22 10:00 AM как в часовом поясе Америка / Нью-Йорк, но похоже, что первоначальная дата будет в UTCпросто смещает его в часовой пояс Америки / Нью-Йорка.

Когда я запускаю startTime.format(), я возвращаюсь 2019-10-22T06:00:00-04:00", который, если я правильно понимаю, представляет 6-часовой часовой пояс "Америка / Нью-Йорк", а не 10:10 утра Америка /Часовой пояс New_York, как я и надеялся.

Итак, как говорится в моем вопросе: я ищу лучший способ, позволяющий пользователю вводить дни и время в любом часовом поясе, а затем убедиться, что он правильно конвертируется изчасовой пояс, который они использовали для UTC для хранения базы данных?

1 Ответ

0 голосов
/ 31 октября 2019

Мне удалось выяснить это, и я предоставлю свое решение ниже.

Я думаю, что раньше слишком усложнял вещи, и это меня смутило дальше:

Подготовка и отправкаЗапрос API от внешнего интерфейса к бэкенду:

Если мой dateTime равен 2019-10-02 10:00 AM EDT (America/New_York):

const dateTime = moment.tz('2019-10-02 10:00 AM', 'YYYY-MM-DD h:mm A', 'America/New_York');

const formatted = dateTime.format(); // gives me => "2019-10-02T10:00:00-04:00"

, я отправляю const formatted (2019-10-02T10:00:00-04:00) на свой бэкэнд.

Перед сохранением в базе данных я использую библиотеку Carbon, чтобы удостовериться, что она смещена к UTC от текущего часового пояса:

$dateTime = Carbon::parse($data['date_time'])->tz('UTC')->toDateTimeString();

MyRequest::create([
    'date_time' => $dateTime,
    ...
]);

Это похоже на правильное сохранение в формате UTC в базе данных как2019-10-02 14:00:00.


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

// incomingDateTime from backend = "2019-10-02 14:00:00"

const dateTime = moment.utc(incomingDateTime, 'YYYY-MM-DD H:mm:ss'); // This is my format in the backend DB.

const dateTimeConverted = dateTime.tz(timezone).format('h:mm A'); // I only want the time here.

dateTimeConverted будет отображаться времядля пользователя в timezone используется выше.

...