PHP日期和时区

时间:2016-09-02 10:34:23

标签: javascript php mysql datetime timezone

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

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

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

有没有适当的'接近这个的方法?我看到一些PHP函数确实使用了时区设置但其他函数没有,例如实际的time()函数没有,即使我创建了一个DateTime对象,输出当前时间戳,更改时区并再次输出时间戳,它只返回两次相同的时间戳。

任何指针都很可爱

2 个答案:

答案 0 :(得分:2)

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

如果您想要在服务器端生成日期字符串,从而返回带偏移量的时间,则可能会出现问题。

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

答案 1 :(得分:1)

一些事情:

  • 您可能不需要为您描述的方案识别用户的时区,但如果您这样做,请注意时区和偏移是两个不同的事情。请参阅"时区!=偏移"在the timezone tag wiki。如果您确实认为自己需要用户的时区(例如"America/Los_Angeles"),请参阅this answer

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

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

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

  • 不要依赖服务器的时区设置来解决任何问题。虽然PHP具有设置"默认"的功能。时区,你应该尽量避免使用它。在每个操作的基础上明确时区是更安全的。使用PHP中的DateTime类,而不是time()

请务必阅读Daylight saving time and time zone best practices,并在StackOverflow上彻底搜索其他问题,因为在其他各种问题中已经回答了很多问题。