【问题标题】:Preserve Local DateTime in Javascript在 Javascript 中保留本地日期时间
【发布时间】:2019-11-15 14:11:42
【问题描述】:

我客户的商店位于 GMT +5:30 时区,但用户的区域设置位于 GMT +8 时区。

目前,我正在使用 javascript 的 .toISOString() 函数转换为 UTC 并将 UTC 存储在数据库中。我从数据库中检索 UTC 并准确发送浏览器,因此 new Date('2019-11-15T00:00:00Z') 函数将 UTC 转换为浏览器的区域设置。

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

我想如果我可以传输用户在浏览器中输入的确切日期并将该确切日期发送到后端以便使用商店的时区轻松抵消会很好?

前端在VueJs,后端在C#

【问题讨论】:

  • “日期越来越乱”是什么意思精确地?听起来事情的表现与应有的完全一样。
  • 当然 - 如果用户与商店处于同一时区,则一切正常。但是,如果用户与商店处于不同的时区,事情就会变得很奇怪 - 错误的 DateTime (UTC) 存储在数据库中。我正在寻找避免这种情况的方法。

标签: javascript json datetime timezone date-formatting


【解决方案1】:

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

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

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

// 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});

示例

var clientTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;

var timeUtc = '2019-11-15T00:00:00Z';

var convertedTime = new Date(timeUtc).toLocaleString("en-US", {timeZone: clientTimezone});

console.log("Time to Current User : " + convertedTime);

var timeInUsa = new Date(timeUtc).toLocaleString("en-US", {timeZone: "America/New_York"});

console.log("Time in America (New York) : " + timeInUsa);

var timeInAustralia = new Date(timeUtc).toLocaleString("en-US", {timeZone: "Australia/Brisbane"});

console.log("Time in Australia (Brisbane) : " + timeInAustralia);

【讨论】:

  • 我正在考虑将 DateTime 作为这种格式 ddMMyyHHmmss 的字符串传递,然后在后端解析它,然后使用商店的时区进行偏移并将 UTC 存储在数据库中?但是,将字符串格式传递给后端是关键...
  • 所以你也想存储时区?为什么要增加存储的数据?上面的解决方案很难吗?
  • 我不想将时区存储在数据库中,数据库应该始终保持 UTC 日期时间。但我想根据商店的设置而不是浏览器的设置来抵消......
  • Exaclty,在上面的解决方案中,我从用户的机器上获取时区,所以即使用户去别的地方也没问题,它会根据用户当前的时区显示日期和时间
  • 是的,如果用户前往另一个国家/地区,那么它还必须在商店配置的时区中显示数据。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2016-04-16
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多