在Javascript中保留本地DateTime

我的客户的商店位于GMT +5:30时区,而用户的语言环境位于GMT +8时区。

当前,我正在使用javascript的.toISOString()函数转换为UTC并将UTC存储在数据库中。我从数据库中检索UTC并将其发送给浏览器,因此new Date('2019-11-15T00:00:00Z')函数将UTC转换为浏览器的语言环境。

但是,如果用户打开由GMT +8时区用户创建的记录(反之亦然),则日期变得混乱。

我认为,如果我可以转移用户在浏览器中输入的确切日期并将该确切日期发送到后端,以方便地使用商店的时区进行补偿,那会很好吗?

前端在VueJs中,后端在C#中。

fangmuxin1 回答:在Javascript中保留本地DateTime

  

始终将UTC时间存储在数据库中

只需将>时间存储在数据库中,在客户端,获取客户端的当前时区,

在这里,我从客户系统获取IANA时区

UTC

然后,根据// get client's timezone (From user's system) var clientTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; 转换UTC并将其显示给用户,

timezone

示例

// assume 2019-11-15T00:00:00Z is the UTC date from your database
var convertedTime = new Date('2019-11-15T00:00:00Z').toLocaleString("en-US",{timeZone: clientTimezone});

,

请注意,js Date对象只是一个表示绝对时间(独立于任何时区)的数字。

因此,用于传输和存储日期的最佳编码/格式是该数字。 IMO这比存储UTC字符串要简单得多。

因此,在最终用户的计算机上,您将对用户提供的日期字符串进行Date.parse解析,这将为您考虑用户的时区,并为您提供在后端发送和存储的绝对时间号。

如果您使用Node,则不要在后端上对日期进行任何格式或解析,因为存在严重的陷阱,并且也不需要这样做:任何需要日期字符串的客户端设备都将在本地进行格式化,会自动将其转换为适合其语言环境和时区的格式。 [编辑:我写这篇文章时,Q没有指定后端。]

您将需要在Date.parse函数中注意一些陷阱,但是与节点问题相比,这些陷阱很小。最重要的IMO是它将YYYY-MM-DD中的日期解释为ISO 8601日期(这是有道理的),但是如果未指定时区,则假定它们是GMT,因此如果您指定了时区,则应确保指定了时区使用该格式。

本文链接:https://www.f2er.com/3094856.html

大家都在问