【问题标题】:Date Picker get Date in given timezone instead of local time日期选择器获取给定时区的日期而不是本地时间
【发布时间】:2021-04-05 20:29:24
【问题描述】:

在我的反应应用程序中,当我使用 moment-timezone 包(具有不同的时区)为日期选择器创建新的日期对象时,时间会自动转换为本地系统时间 + 选择的时区时间。 有没有办法在客户端设置一个时区来创建一个新的日期对象? 我使用时刻时区进行全球化,使用 Meteor Js 进行后端

【问题讨论】:

  • 它应该会自动选择您的区域设置。您的服务器可能需要为其时区设置环境设置。
  • 感谢@Mikkel 的回复,我无法完全理解,我需要在react 组件中为我的日期选择器创建一个新的Date 对象,如何将我的服务器环境添加到此功能中?你能解释一下吗?
  • 只是为了澄清:您的日期和时刻相关代码是在客户端还是服务器端?你在哪里使用它? (在同一方面,或者您是否以某种方式将日期发送到您看到问题的另一方?)
  • @ghybs 我将用户时区存储到数据库中,当用户登录系统时,时区从 db 获取并使用 moment-timezone 包转换所有日期,我在显示时没有任何问题不同时区的所有日期,当我尝试创建日期选择器时遇到问题,我必须将新的日期对象传递给日期选择器功能,我需要使用用户时区创建日期选择器。

标签: javascript reactjs meteor momentjs moment-timezone


【解决方案1】:

如果我理解正确,您的问题是您想提供一个 Date Picker UI,该 UI 会根据所选日期和用户时区设置(从您的数据库中检索)自动生成一个 Date 对象,但您得到的是一个日期用户的本地时间(因此可能已经有一些时区偏移)+用户时区偏移设置。

您主要有 3 种可能的解决方案:

  1. 让日期选择器 UI 始终提供 UTC 日期(通常在 UTC 午夜),然后添加用户的时区偏移设置。
  2. 让日期选择器 UI 将用户的时区设置作为配置,以便在自动生成日期时使用该时区偏移配置。
  3. 让日期选择器 UI 在浏览器本地时间中提供日期,然后将其转换为 UTC,然后添加用户的时区偏移设置。

选项 1 UTC 中的 DatePicker: 我还没有看到任何提供此类选项的库,但听起来并不太奇怪,因此您可能会找到一个提供此类选项的库。或者您可能会摆弄组件代码...与选项 3 相比,这可能是矫枉过正。

选项 2 带有时区配置的 DatePicker: 从您的评论来看,这听起来像您所期望的。不幸的是,我也没有看到任何提供此类功能的库。由于这听起来比选项 1 更具体,因此您不太可能找到这样的库。

选项 3 本地时间转换为 UTC 然后添加用户时区:这是实现在给定时区生成日期目标的标准做法,从本地时间的日期开始,由于所有 DatePicker UI 都只使用本地时间来简化事情。至于将当地时间转移到UTC,您应该已经有很多关于SO的问题和答案了。

如果您必须为日期选择器 UI 提供初始值(通常是数据库中的先前值),请确保执行反向操作,即减去用户的时区偏移设置以获取 UTC 日期,然后切换到浏览器区域设置时间。当本地时间与 UTC 有负偏移时,我已经看到忽略这部分并且日期不正确的应用程序。

【讨论】:

  • 非常感谢您的解释,我正在使用 material-ui/DatePicker 为我的搜索表单选择 FROM 和 TO 日期范围。我必须为我的搜索表单设置我的 maxDate 和 minDate 限制。所以我像这样为 maxDate 和 minDate 创建了 2 个变量,,, var maxFromDateRange = new Date(moment.tz("user timezone").subtract(1, 'years').startOf('day')); var maxToDateRange = new Date(moment.tz("user timezone").endOf('day')); ,,, 但是当我的用户时区与用户系统时区不同时,日期选择器日期会搞砸,我无法在 datepicker 配置中配置时区
  • 如果我理解正确,您希望最早从今天开始减去 1 年,最晚到今天结束?并检索用户时区中的选定日期(如数据库中配置的那样)?在这种情况下,您可以简单地使用上述选项 3:不要在日期选择器或其边界内混淆时区,只需使用浏览器本地时间。然后在使用选定日期时,从本地转换为 UTC 到用户 tz(来自 db)。
  • 是的,你是对的,我们最好不要在日期选择器中弄乱时区,使用接受输入日期作为字符串而不是日期对象的日期选择器怎么样,我打算更改我的材料-ui/DatePicker 到另一个日期选择器,引导日期选择器接受输入日期作为字符串。您如何看待这种方法?
  • 我不知道您指的是哪个确切的小部件。试一试。但我怀疑它的行为会如上面第 1 点和第 2 点所述,即他们可能会忽略时区。例如。旧的 react-bootstrap-date-picker:github.com/pushtell/react-bootstrap-date-picker/issues/155
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多