Сохраните дату, как если бы они были введены в определенном часовом поясе - PullRequest
0 голосов
/ 28 ноября 2018

Я использую момент.Мне нужно, чтобы пользователи вводили дату, и чтобы в Австралии / Перте всегда было время, независимо от того, какой браузер установлен.Например, предположим, что для компьютера установлено сиднейское время (которое сейчас равно +3, а зимой - +2).Я хочу, чтобы пользователь ввел дату / время и удостоверился, что эта дата / время хранится как время Перта.

Обратите внимание, что визуализация правильная дата не является проблемой (сmoment.tz).Что меня беспокоит, так это создание объекта даты, которое должно произойти, предоставляя время и заставляя браузер делать вид, что они находятся в этом часовом поясе.

Мне нужно, чтобы это работало независимо от перехода на летнее время и т. Д.

ОБНОВЛЕНИЕ : это то, чего я хочу добиться:

// MY CURRENT TIMEZONE IS SYDNEY, CURRENTLY PERTH + 3 BUT +2 IN SUMMER
// IN PERTH IT's 10:11AM, and *THAT* is the time I am interested in 
// storing, not 13:11:58
var d = new Date()
// => Wed Nov 28 2018 13:11:58 GMT+1100 (Australian Eastern Daylight Time)

// NOTE: the date 13:11:58 SYDNEY time. I don't want this.
// I MUST pretend that users entered the date with their timezone
// is in Perth
// So...

// Create a date string that exclude original timezone and includes new timezone
perthDateString = moment(new Date()).format('YYYY-MM-DDTHH:MM:ss') + '+0800'
// => "2018-11-28T13:11:58+0800"

// Make a new date object using the tinkered date string 
var newD = new Date(perthDateString)

// Display the date. Note: the time is "wrong" (since it displays
// a time that is 3 hours ahead), but it's actually the correct
// answer since 'd' is meant to be Perth time in the first place
newD
// => Wed Nov 28 2018 16:11:58 GMT+1100 (Australian Eastern Daylight Time)

// Display the date as the Perth time
moment.tz(newD, 'Australia/Perth').toString()
// => "Wed Nov 28 2018 13:11:58 GMT+0800"

Однако:

  • в perthDateString = moment(new Date()).format('YYYY-MM-DDTHH:MM:ss') + '+0800',Я хотел бы указать Australia/Perth, а не '+0800'

  • Мне неловко работать с датами, обрезая / объединяя строки

  • Интересно, сможет ли КАЖДЫЙ браузер проанализировать дату, возвращаемую .format('YYYY-MM-DDTHH:MM:ss') + '+0800', или у меня будут сюрпризы, особенно когда / если у меня есть решение, чтобы я использовал Australia/Perth вместо

1 Ответ

0 голосов
/ 28 ноября 2018

Если вы находитесь в любой точке мира (скажем, в Сиднее или Токио), и местное время - «12:30», но вы хотите сохранить то же время суток («12:30»), как если бывы были в Перте - вы можете использовать пакет момент-час вместе с момент .

Например, этот фрагмент даст вам moment для "12:30 "в Перте:

let x = moment.tz('2019-01-01T12:30:00', 'Australia/Perth')
console.log(x.format());  // Show that it is 12:30 in Perth time
console.log(new Date(x)); // Generate Date for that time
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="http://momentjs.com/downloads/moment-timezone-with-data.js"></script>
...