【问题标题】:PHP dates and timezonesPHP 日期和时区
【发布时间】:2017-01-10 10:42:03
【问题描述】:

我有一个管理面板,其中输入的项目将具有 time_posted 和过期时间。这些时间在输入时使用时间戳 (time())。

我希望过期时间的输入使用花哨的日期/时间选择器,但选择器使用 JavaScript 客户端时间而不是服务器时间。

解决此问题的一种方法是保存用户所在的时区,然后将其用作输入数据的偏移量,但必须 100% 正确。

是否有任何“正确”的方法来解决这个问题?我看到一些 PHP 函数确实使用时区设置,但其他函数没有,例如实际的 time() 函数没有,即使我创建了一个 DateTime 对象,输出当前时间戳,更改时区并输出时间戳再次它只是返回相同的时间戳两次。

任何指针都会很可爱

【问题讨论】:

  • time() 返回一个 Unix 时间戳,这个时间戳独立于时区。
  • 这不是我的问题,我的问题是关于使用偏移量服务器端从客户端根据帐户保存的时区发送的本地时间戳获取正确的 Unix 时间戳
  • 获取精美的日期选择器,为您提供一个 UNIX 时间戳/Javascript Date 对象,您可以从中获取与时区无关的 UNIX 时间戳。
  • 你在考虑什么“花哨的日期/时间选择器”?对于这个应用程序,您绝对需要一个从服务器时间而不是从浏览器时间(客户端时间)初始化的日期/时间选择器。客户端时间根本不够可靠。
  • 我正在使用一些管理面板主题,其中似乎包含 trentrichardson.com/examples/timepicker 的修改版本。似乎它甚至不返回时间戳,而是返回所选时间的字符串。我猜我可以使用这个字符串 + 保存的时区?

标签: javascript php mysql datetime timezone


【解决方案1】:

我假设无论最终用户有什么设置/时区,实际的时间戳值仍然是正确的(独立的)。

当/如果您想在服务器端生成日期字符串并因此返回带有偏移量的时间时,可能会出现问题。

要么 1. 不要在服务器端生成日期字符串,如果您不确定时区偏移或 2. 警告用户并确保他们指定他们的时区,然后在您从时间戳输出日期字符串时强制使用该时区

【讨论】:

  • 问题主要是保存的值需要是一个unix时间戳(显然)。我需要一种将客户端时间转换为 unix 时间戳的方法,并且需要从 unix 时间戳中显示用户时区的时间。真的就这么简单保存Unix时间戳,然后用一个DateTime对象来显示吗?
  • 是的,就是这么简单。如果您想根据最终用户的计算机时间显示时间,只需在 javascript 中执行即可。我不知道细节,但我认为设置/存储用户指定的时区会更安全。这样当同一用户或其他人从不同时区的计算机登录时,显示的时间仍然与原始输入匹配。
【解决方案2】:

一些事情:

  • 您可能不需要为您描述的场景识别用户的时区,但如果您这样做了,请认识到时区和偏移量是两个不同的东西。请参阅the timezone tag wiki 中的“时区!= 偏移量”。如果你真的认为需要用户的时区(如"America/Los_Angeles"),那么请参考this answer

  • 如果您希望输入的日期与客户端的本地时区相关,那么您需要在 JavaScript 中使用 Date 对象或类似 moment.js 的库。使用日期选择器中的各个日期/时间组件来获取 unix 时间戳或 UTC 格式的 ISO8601 格式的日期/时间字符串。例如,"2016-09-02T01:23:45Z"

  • 如果您希望输入的日期与某个其他时区相关,那么您需要传输客户端输入的实际值而无需修改。最好的方法是采用 ISO8601 格式,没有偏移。例如,"2016-09-02T08:00:00"。在服务器端,解析该值并应用任何适用的时区。

  • 如果您只选择日期而不是时间,那么您应该真正考虑是否有任何时间适用。 00:00 真的适用吗?还是应该是24:0023:59:59.999?如果您不关心用户的时区,那么实际上您根本不应该分配任何时间值。只是通过日期。例如:"2016-09-02"

  • 不要特别依赖服务器的时区设置。尽管 PHP 具有设置“默认”时区的功能,但您应该尽量避免使用它。在每个操作的基础上明确时区要安全得多。在 PHP 中使用 DateTime 类,而不是 time()

请务必阅读 Daylight saving time and time zone best practices,并彻底搜索 StackOverflow 上的其他问题,因为其中大部分已在其他各种问题中得到解答。

【讨论】:

  • 我绝对需要偏移量而不是时区来向用户显示时区,但是让他们通过在配置文件设置中选择时区来选择偏移量比让他们输入偏移量要容易得多。感谢其他指点。
  • 请小心 - 您无法获取当前偏移量并假设它适用于所有时间点。许多人犯了这个错误。夏令时会妨碍您。
  • 但是如果我使用 DateTimeZone/DateTime 来格式化日期应该没问题吧?设置时间戳,设置时区然后格式化?
  • 取决于您如何收集时间戳。很难说你目前是如何呈现事物的。试一试,如果您遇到困难,请发布一个包含详细信息的新问题。
  • 实际上我没有设置任何东西,现在数据库中的时间戳(发布时间)只是 PHP 的time()。我会试一试,如果我无法弄清楚,你会在几个小时内看到一个新问题!到目前为止谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2015-03-11
  • 2012-07-18
  • 2014-11-10
  • 1970-01-01
相关资源
最近更新 更多