为什么mktime返回错误的结果


Why mktime returns wrong result?

今天是欧洲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()));