一个 PHP 时区问题

2020-08-10 16:33:28 +08:00
 lovecy

想问下 V 友们关于海外业务,服务器时区一般是跟随机器时区,还是程序内配置? 另外 PHP 提供了好多地区的时区配置,不知道有什么区别 例如Asia/ShanghaiEtc/GMT-8好像都表示东八区,但又找不到我们平时说的+08:00这样的表示

1251 次点击
所在节点    问与答
9 条回复
chotow
2020-08-10 17:12:02 +08:00
- Asia/Shanghai 和 Etc/GMT-8 属于 TZ 数据库( TZ database )的写法
- +08:00 是 ISO 8601 中时区的写法

前者常在设置的时候使用,后者常在展示的时候使用。
(个人观点,欢迎指教)

php 中 TZ 的配置项:
https://www.php.net/manual/en/timezones.php

对于中国大陆来说,标准写法是 Asia/Shanghai ;而 PRC 、Etc/GMT-8 是向后兼容的写法,php 官方并不推荐。
lovecy
2020-08-10 17:34:58 +08:00
@chotow 主要是可能一个服务器面向多个地区提供服务,这种情况是不是按服务器所在地的时区来就好了,比如泰国和越南是同个时区,服务器在越南就用`Asia/Ho_Chi_Minh`,在泰国就用`Asia/Bangkok`。
lovecy
2020-08-10 17:37:19 +08:00
使用指定地区的时区,是不是可以自动适配当地的时间政策,比如夏令时之类的骚操作
sujin190
2020-08-10 18:14:12 +08:00
@lovecy #2 一般来说,正确做法应该是服务器保存就带了时区,返回前端时候带上时区格式化,现实到页面上的时候在 format 到本地时区,那么这时候服务器保存的啥时区似乎不重要,重要的是显示的时候要格式化成本地时区,mysql 这种不支持时区的可以选择一个固定时区在输出的时候加进去就行了
sujin190
2020-08-10 18:16:01 +08:00
@chotow #1 php 的 Asia/Shanghai 和 Etc/GMT-8 完全是一样的,但是把 python 的 datetime 就差了几分钟,然后被这个问题坑到死啊,后来就只用 Etc/GMT-8 了
lovecy
2020-08-12 17:44:49 +08:00
@sujin190 因为旧项目在源码配置写死了 Asia/Shanghai,这个已经改不了了,所以只能手动配置服务端时区了。
话说我很好奇,为啥只有 Asia/Shanghai,没有 Asia/Beijing,我们平时不都说北京时间么。另外 python 的这两个时区时间不一致,是根据的标准不同导致的么。。
sujin190
2020-08-12 18:32:05 +08:00
@lovecy 估计不是,北京时间按定义应该是东八区时间,但是吧每个时区似乎是又可以细分的,上海其实不完全在东八区起始位置,所以应该 python 是用了细分后的时区,但是吧数学上也许看起来更严谨现实来说就很坑人了
lovecy
2020-08-12 19:32:10 +08:00
@sujin190 嗯,我就感觉 Asia/Shanghai, Asia/Hong_Kong 这种,应该都是指本地的时间,然后可能有些规范规定了本地时间和所在时区时间一致,这样子。感觉数学计算,还是获取 timestamp 之后,再来算会好一点,毕竟所有地方的 timestamp 都是一致的
lovecy
2020-08-12 19:39:46 +08:00
@sujin190 话说按你这个说法,用 Etc/GMT-8 好像更好一点,但是 php 官方已经标记为过时了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/697106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX