我想要存档的是基于用户默认时区通过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%准确
答案 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');
那应该这样做!