就像在特定时区中输入日期一样存储日期

时间:2018-11-28 00:59:20

标签: javascript date timezone momentjs

我正在使用Moment。我需要用户输入日期,并且无论浏览器设置为什么,都要确保这始终是澳大利亚/珀斯的时间。 例如,假设计算机设置为悉尼时间(现在是+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'返回的日期,或者我是否会感到惊讶-尤其是当/如果我有解决方案以便使用{{1 }}

1 个答案:

答案 0 :(得分:1)

如果您位于世界上的任何地方(例如悉尼或东京),并且本地时间是“ 12:30”,但您想要存储的是同一天(“ 12:30”),就像您曾经在珀斯(Perth)–您可以将moment-timezone软件包与moment一起使用。

例如,此代码段将为您在珀斯的“ 12:30”提供一个moment

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>