Почему mktime возвращает неправильный результат? - PullRequest
1 голос
/ 24 января 2012

Сегодня для Европы 2012 год.Я использую mktime, чтобы получить объект DateTime о сегодняшнем дне, полночь .Почему написано 23 часа 23 поколения , а не 00: 00 из 24 поколения ?

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 Ответ

2 голосов
/ 24 января 2012

mktime использует информацию о часовом поясе при определении того, каким должно быть возвращаемое время, и возвращает значение, соответствующее UTC.Если вы хотите переопределить это, вам нужно передать явный is_dst = 0 параметр

. Затем вы используете это время UTC при создании объекта DateTime (это то, что делает @), что означает, чточасовое смещение реплицируется в объект DateTime.

Поскольку mktime использует информацию о местном часовом поясе, вы должны использовать альтернативу gmmktime, если вы хотите получить полуночный UTC, используя -

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