Вот сценарий:
1 - Пользователь открывает веб-сайт и вводит его в 07:00, используя раскрывающееся поле, которое даст мне следующее:
// 1578600000000 => Сохранить в DB // Пт 10 января 2020 07:00:00 GMT + 1100 (по восточному летнему времени Австралии)
Сам пользователь находится в Сиднее , что означает, что его локальные часы включены GMT+1100
Однако он хочет представить это время как время Азии / Тегерана, потому что именно там он будет завтра. По сути, он хочет, чтобы я полностью игнорировал его местное время и видел его, как будто он в Азии / Тегеране. Поэтому, когда он завтра в Tehran
, он может видеть, что в его календаре есть 07:00am
.
С другой стороны, люди во всем мире, которые будут видеть его доступное время, скажем, с Australia/Perth
.
Я думал, что что-то похожее на приведенную ниже работу, согласно документации momentJS
, но это не так.
Сначала преобразуйте часовой пояс в Asia/Tehran
, который является желаемым местом пользователя :
const desiredTimeZone = 'Asia/Tehran';
let OriginalDesired = moment.tz(1578600000000,desiredTimeZone);
Затем, представляя его людям в Australia/Perth
, убедитесь, что он находится в их часовом поясе
const PerthTimeZone = 'Australia/Perth`; // this is dynamic, can be anything
OriginalDesired.clone().tz(PerthTimeZone);
Я наивно думал, что это должно сработать. Но я заметил, что оригинальная отметка времени 1578600000000
- это отметка времени UTC
, то есть на самом деле она не 07:00am
, а на самом деле 20:00pm
, потому что Javascript
вычла 11
часов, что является очень оригинальным пользователем Смещение локального часового пояса от пользовательской записи.
Мне удалось обойти его, сложив и вычтя смещение драматическим c способом, но оно работает только в одном сценарии.
const originalTime = 1578600000000;
const LocalAdjustment = moment(originalTime).tz("Australia/Sydney").utcOffset() * 60000;
const DesiredAdjustment = moment(originalTime).tz("Asia/Tehran").utcOffset() * 60000;
const newUTC = originalTime + LocalAdjustment - DesiredAdjustment;
И при представлении этого пользователю в Tehran
moment(newUTC).tz("Asia/Tehran").format('hh:mma'); // 07:00am.
Я знаю, что это, вероятно, глупо и, очевидно, работает только в одном сценарии, но это правильный путь, который я иду ? или есть более простой способ?
Кстати, все расчеты на моем сервере, который 'UT C'.