我有一个管理面板,其中输入的项目将具有time_post和过期时间。这些时间在输入时使用时间戳(time()
)。
我希望使用花哨的日期/时间选择器输入过期时间,但是选择器使用JavaScript客户端时间而不是服务器时间。
解决这个问题的一种方法是保存用户所在的时区,然后使用该时区作为输入数据的偏移量,但它必须是100%正确的。
有什么"合适"的方法来处理这个问题吗?我看到一些PHP函数确实使用时区设置,但其他函数没有,例如实际的time()
函数没有,即使我创建一个DateTime
对象,输出当前时间戳,更改时区并再次输出时间戳,它只返回相同的时间戳两次。
任何指针都是可爱的
我假设实际的时间戳值仍然是正确的(独立的),无论最终用户的设置/时区是什么。
当/如果你想在服务器端生成日期字符串,从而返回带有偏移量的时间时,可能会出现问题。
要么 1。不生成日期字符串服务器端,如果你不确定时区偏移或 2。警告用户并确保他们指定他们的时区,然后当您从时间戳
几点:
您可能不需要为您描述的场景识别用户的时区,但如果您这样做了,那么请认识到时区和偏移量是两个不同的东西。请参阅时区标签wiki中的"time zone != offset"。如果您确实认为需要用户的时区(例如
"America/Los_Angeles"
),那么请参考此答案。如果您希望输入的日期相对于客户端的本地时区,那么您需要使用
Date
对象或JavaScript中像moment.js这样的库。使用日期选择器中的各个日期/时间组件来获取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()
。
一定要阅读夏令时和时区最佳实践,并在StackOverflow上彻底搜索其他问题,因为这些问题已经在各种其他问题中得到了回答。