在PHP中给定Unix时间戳获取时区偏移量

3

我有一个Unix时间戳来自数据库,该数据库位于某个时区,该时区的偏移量为+3600或+7200,具体取决于它是否处于夏令时。这以前从未成为问题,但我们的网站目前正在面向更国际化的受众,并且由于Javascript与这些时间戳的交互,我需要在没有任何偏移的情况下转换时间戳。

那么,如何在给定Unix时间戳的情况下,获取该时区在该时间戳时刻的偏移量呢?我正在查看PHP文档,但是有很多日期/时间函数让我有点迷失。

我正在使用PHP 5.2.3


3
我认为这是不可能的,因为UNIX时间戳中并没有存储任何时区信息,它只是从1970年1月1日开始计算的秒数。 - Bobby
2
@bobby:虽然它不存储任何时区信息,但Unix时间被定义为UTC。 - Kjetil Joergensen
@kjetijor:但是如果生成的话,UNIX时间戳不是更或多或少地本地化了吗? - Bobby
@Bobby:只有在您的服务器设置出现非常严重的问题时才会出现这种情况。 - Alix Axel
5个回答

4

我感觉有点儿傻,因为我要回答自己的问题。不过刚刚我找到了gmstrftime函数。它似乎完全符合我的需求。谢谢大家!


2
在一般情况下,你不能这样做。Unix时间戳只是自Unix纪元以来的秒数,不包含任何时间戳信息。
一个可能适用于你的方法是确定给定时间戳是否发生在DST生效期间,然后进行相应的调整。但是,在边界处这种方法会失败(因为在DST开始和结束后的那个小时中,每个时间戳有两个意义)。
将时间戳存储为UTC,可以避免这种问题,这也是未来更好的做法。

是的,我知道我应该如何存储时间戳,但在我开始在这里工作时有很多现有数据都是这样的。所以我只是顺其自然... - Aistina
1
Unix时间是协调世界时(UTC),它具有偏移量0和无夏令时调整。无需调整您的Unix时间戳。 - Kjetil Joergensen
ж—¶й—ҙжҲіжқҘиҮӘPHPзҡ„time()еҮҪж•°гҖӮе®ғиҺ·еҸ–Unixж—¶й—ҙ并еә”з”ЁжңҚеҠЎеҷЁзҡ„ж—¶еҢәеҒҸ移йҮҸгҖӮ - Aistina
@kjetijor - 这是真的,但我认为通过“Unix时间戳”,OP只是指代一个数字,它代表了自1970年1月1日00:00以来的秒数,在某个时区内(从他的回答中可以看出,这个时区是带有夏令时调整的GMT)。 - Dominic Rodger

2
如果你说的是Unix时间戳(自纪元以来的秒数),那么偏移量始终为0。纪元被定义为UTC 1970年1月1日00:00:00。请注意UTC,其偏移量为0。
时区偏移和夏令时的应用由将Unix时间戳转换为日期/时间结构的库处理。(我不知道PHP,但例如在C中,localtime函数接受一个Unix时间戳,从环境或/etc/localtime文件中应用时区信息,并输出一个包含秒、分、小时等的结构体)。

1

你可以使用这个:

$timezone_offset = date('O');

它将以小时为单位返回与格林威治时间(GMT)的差异。

[来源]


0

当然,这只适用于未来,因为您无法仅从Unix时间戳知道创建时所在的时区。 - Mike A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接