为什么mktime会返回错误的结果?

时间:2012-01-24 17:12:53

标签: php datetime date timestamp

今天是欧洲的2012年第24代。我今天使用mktime来获取 DateTime 对象,午夜时间。为什么它说 23 gen的23点,而不是 24:00的00: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)

1 个答案:

答案 0 :(得分:2)

mktime在决定返回的时间应该是什么时使用本地时区信息,并返回与UTC对齐的值。如果要覆盖它,则需要传入明确的is_dst = 0参数

然后在构造DateTime对象时使用此UTC时间(这是@所做的),这意味着将小时偏移量复制到DateTime对象中。

由于mktime使用本地时区信息,如果您想使用 -

获取午夜UTC,则应使用替代gmmktime
$date = DateTime('@' . gmmktime(0, 0, 0));

如果您想要午夜服务器时间,然后将输出转换为用户的时区,例如'Europe / Paris'你会做以下事情:

$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()));