今天是欧洲2012年第24代。我正在使用mktime
获取一个关于今天午夜时间的DateTime对象。为什么它说23代的23点,而不是24代0:00?
var_dump(new DateTime('@' . mktime(0, 0, 0)));
输出:
object(DateTime)[5]
public 'date' => string '2012-01-23 23:00:00' (length=19)
public 'timezone_type' => int 1
public 'timezone' => string '+00:00' (length=6)
mktime在决定返回时间时使用本地时区信息,并返回一个与UTC对齐的值。如果你想覆盖它,那么你需要传入一个显式的is_dst = 0
参数
然后,在构造DateTime对象时使用这个UTC时间(@
就是这样做的),这意味着小时偏移量将复制到DateTime对象中。
由于mktime
使用本地时区信息,如果您想使用-获得午夜UTC,则应使用备用gmmktime
$date = DateTime('@' . gmmktime(0, 0, 0));
如果您想要午夜服务器时间,然后将输出转换为用户的时区,例如"欧洲/巴黎",您可以执行以下操作:
$date = DateTime('@' . mktime(0, 0, 0));
$date->setTimeZone(new DateTimeZone('Europe/Paris'));
print $date->format(DateTime::RFC850) . "'n";
您可以使用将其转换为服务器的本地时间
$date->setTimezone(new DateTimeZone(date_default_timezone_get()));