我有一个管理面板,其中输入的项目将包含time_posted和到期时间。这些时间在输入时使用时间戳(time()
)。
我希望输入过期时间以使用精美的日期/时间选择器,但选择器使用JavaScript客户端时间而不是服务器时间。
解决这个问题的一种方法是保存用户所在的时区,然后将其用作输入数据的偏移量,但这必须是100%正确的。
有没有适当的'接近这个的方法?我看到一些PHP函数确实使用了时区设置但其他函数没有,例如实际的time()
函数没有,即使我创建了一个DateTime
对象,输出当前时间戳,更改时区并再次输出时间戳,它只返回两次相同的时间戳。
任何指针都很可爱
答案 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上彻底搜索其他问题,因为在其他各种问题中已经回答了很多问题。