我有一个计划应用程序,其中包含我从头开始构建的日历。作为律师,您应该可以配置您的预订时间,如下所示:
澳大利亚有律师的人:
1- 10/01/2020,从07:00 am到08:am...
这是我的工作:
1-用Javascript获取输入日期的epoch
号:
const dateFrom = new Date(firstOfJanSevenAm).getTime() // 1578600000000
// Fri Jan 10 2020 07:00:00 GMT+1100 (Australian Eastern Daylight Time)
const dateTo = new Date(firstOfJanEightAm).getTime() // 1578603600000
// Fri Jan 10 2020 08:00:00 GMT+1100 (Australian Eastern Daylight Time)
2-将其发送到NodeJS
服务器并保存为MongoDB
Mongoose.save({
from:dateFrom, //1578600000000
from:dateTo //1578603600000
})
3-在日历中表示它:
<div>{format(from, 'HH:mm')}</div>
一切正常。
[现在,这名律师前往美国,并且正在使用美国当地时间(在任何城市)在咖啡店里,他打开日历,他想添加一些空缺时间,但在悉尼时间。我需要为他提供timezone dropdown,这样他可以告诉我他希望新日期基于他的家Syndey。
问题:
1-我是否正在保存日期,并在旁边单独保存timeZone,并且在表示日期时,仅应用timeZone?
Mongoose.save({
from:dateFrom, //1578600000000
from:dateFrom //1578603600000
currentTimeZone : 'America/Costa_Rica',
desiredTimeZone: 'Australia/Sydney'
})
<div>{formatWithTimeZone(from, 'HH:mm',desiredTimeZone)}</div>
这就是我所要做的吗?还是我天真地错过了会让我绊倒的东西?
回到我最初的问题,整个“总是将时间存储为UTC”的地方在哪里?
我所意识到的是,当我使用我正在使用的库date-fns-tz
并尝试将用户输入的日期转换为UTC
时,我得到的输出完全相同:
const dateFrom = new Date(firstOfJanSevenAm).getTime() // 1578600000000
const dateFromUTC = zonedTimeToUtc(dateFrom,currentTimeZone) // 1578600000000
// currentTimeZone is America/Costa_Rica, when he is in Costa Rica's caffee shop.
enter code here
1578600000000 === 1578600000000 = true
所以将输入日期转换为utc
日期时为什么会得到相同的输出?
我将给您一个与技术实施脱节的答案。让我们考虑矛盾的是,您有一名律师居住在澳大利亚,另一名居住在瑞士,如果您决定将时间存放在他们首选的位置会怎样?
然后您需要保存两个信息:当然是时间(上午11点),但是它是相对的,因此您还需要存储时区(澳大利亚的上午11点或瑞士的下午1点)
现在,如果您的律师前往法国会怎样?您是否要更新他的所有日历信息?上午11点不再是11点了。
UTC解决了这个问题,您只需要存储上午11点或下午1点。 UTC是任意的绝对值,按照惯例是通用的。
因此,您的后端/数据库应始终将此类信息存储在UTC中。您需要一种了解用户时区的方法,也许可以使用Web界面进行更新,并且可以将其存储在用户数据库中或仅存储在cookie中。也许您想通过使用用户的位置,IP,浏览器的语言等来自己获取它。
现在您知道他的时区,您的服务器可以将UTC(绝对)时间发送给客户端,并且客户端可以无缝显示正确的(相对)时间。
客户端处理相对时间,服务器始终将其设为绝对时间。