尝试理解PHP中的时间戳和时区

3
我有一个需要支持时区的PHP应用程序。现在我正在将日期和时间值作为整数存储在数据库中。这是我的做法。
// now create the DateTime object for this time and user time zone
$dtime = new DateTime($date_time, new DateTimeZone($time_zone));
$timestamp = $dtime->format('U');

我不理解的是,即使一个人身处新西兰(太平洋/奥克兰),并且应用程序存储了这个日期:2010年12月24日00:00:00,使用上面的代码,该值的返回值为:1293102000。
然后,使用完全相同的日期/时间,并将时区设置为伦敦(欧洲/伦敦),我得到了这个时间戳:1293148800。
为什么时间戳不同?我以为时间戳应该是与Unix纪元相同日期的秒数?
如果它们不同,那就意味着当有人在数据库中搜索所有记录在2010年12月24日00:00:00至2010年12月24日23:59:59之间的记录时,我需要使用用户时区来创建时间戳,并且必须首先使用时区来创建时间戳。
救命啊!
1个回答

0

由于新西兰的时区为+1300 UTC,而伦敦为零UTC,13 x 3600秒 = 1293148800-1293102000

既然您已经将其存储为整数,那么在构建$dtime时应该跳过时区,而不是始终使用零UTC

用于测试

# date_create is procedural style
$obj =  date_create('24-12-2010 00:00:00', new DateTimeZone('europe/london'));
echo $obj->format('U');

$obj =  date_create('24-12-2010 00:00:00');
echo $obj->format('U');

从php.net引用:“自Unix纪元(1970年1月1日00:00:00 GMT)以来的秒数”,因此format("U")应该返回一个GMT时间戳,而不考虑时区。 - Gabi Purcaru
嗨,谢谢。你能再解释一下“在构造$dtime时,应始终使用零UTC”吗?你是说我需要创建没有时区的时间戳吗? - Marc
所以我的代码应该是: $dtime = new DateTime('24-12-2010 00:00:00'); $timestamp = $dtime->format('U'); - Marc
你好 - 可以提供选项1和2的示例代码吗?感谢您的所有帮助! - Marc
@Marc - 我认为这应该是一个新问题,而不是现在的问题。 - ajreal
显示剩余6条评论

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