需要检查夏令时

时间:2014-08-24 03:49:19

标签: php date datetime time save

我想要存档的是基于用户默认时区通过IP发布帖子的时间。

我担心的是夏令时,所以如果现在是1:46 PM,那么如果夏令时有效,它可能仍然会在下午1:46发布更新而不是确切时间下午3:46

问题是PHP会自动检查吗?或者我需要做些什么来查看夏令时是否有效

$timezone = '+0:00';
$timezone = preg_replace('/[^0-9]/', '', $timezone) * 36;
$timezone_name = timezone_name_from_abbr(null, $timezone, true);
date_default_timezone_set($timezone_name);
echo date('D d M Y H:i:s');

谢谢:)

只需检查一切都需要100%准确

1 个答案:

答案 0 :(得分:0)

答案是肯定的,无论DST如何,PHP都可以根据时区为您提供精确的时间。例如,如果用户的IP告诉您他们在纽约,您可以

$date = date_create('now America/New_York');

使用纽约当前时间创建DateTime对象。

echo $date->format('h:i:s');

顺便提一下,DST目前有效,此代码打印正确的当前时间为12:21:32。


修改

在回答您的后续问题时,是的,您保存的时间是您要检索的时间。例如,

$timestamp = (int) $date->format('U');
无论时区或夏令时如何,

都会将绝对unix时间保存为12:21:32(或无论何时运行此代码)。另一个DateTime对象将产生相同的时间:

$retrieved = new DateTime;
$retrieved->setTimestamp($timestamp);
echo $retrieved->format('h:i:s'); // outputs '12:21:32'

希望有所帮助。

编辑2

要回答您的下一个问题,确实可以将您保存的日期时间调整到其他时区。首先,将脚本的默认时区设置为UTC。

date_default_timezone_set('UTC');

然后,您可以保存上面显示的时间戳(除了不指定时区),当您检索它们时,您可以将它们调整到用户所在的位置:

echo $retrieved->format('h:i:s'); // Outputs UTC time of 5:21:32
$retrieved->setTimezone(new DateTimeZone('America/New_York'));
echo $retrieved->format('h:i:s'); // Outputs correct New York time of 12:21:32

即使在DST结束后,此代码仍会显示12:21:32(或者,无论何时运行它都会显示)

希望再次有所帮助!


编辑3

要解决最近的问题,您始终可以根据用户的设置调整DateTime对象。例如,如果他们决定将DST重写为关闭,那么您应该

// Change your default timezone to that of your user
date_default_timezone_set('America/New_York');

// Check for daylight savings time with date('I')
if (date('I', $timestamp) == 1) $retrieved->modify('-1 hour');

那应该这样做!