Php strtotime возвращает неправильную метку времени

I do

strtotime("2008-09-04")

Где 09 - месяц, а 04 - день, и я получаю результат:

1220500800

Это четверг, 04 сентября 2008 г., 04:00:00 по Гринвичу. Откуда эти 4 часа? Я должен получить 1220486400 вместо 1220500800 из strtotime.


person Unusual    schedule 06.03.2014    source источник
comment
Вы учитывали часовые пояса в этом?   -  person John Conde    schedule 07.03.2014
comment
часовые пояса. Общий совет: если вы имеете дело со временем и получаете значение, отличающееся на ТОЧНОЕ количество часов (4:00, 3:00, -2:00), это почти ВСЕГДА проблема с часовым поясом.   -  person Marc B    schedule 07.03.2014
comment
Я это запомню, спасибо!   -  person Unusual    schedule 07.03.2014


Ответы (3)


Вы можете установить часовой пояс глобально с помощью функции date_default_timezone_set('UTC'); или просто установить часовой пояс локально при вызове функции strtotime(), например:

echo strtotime("2008-09-04 +0000"); # 1220486400
person Glavić    schedule 06.03.2014

Как сказали люди выше, вы, вероятно, страдаете от несоответствия часового пояса. Эта функция может быть полезна при отладке проблемы: http://us3.php.net/date_default_timezone_get.

person gordoncarroll    schedule 06.03.2014

Наиболее распространенные проблемы с strtotime в PHP связаны с часовыми поясами и форматами даты и времени. Я рассмотрю эти 2 пункта.

  1. Сначала формат. Как было предложено другими в stackoverflow, используйте формат даты iso 8601 ГГГГ-ММ-ДД (https://www.iso.org/iso-8601-date-and-time-format.html). Например, 27 сентября 2012 года представлено как 2012-09-27.
  2. Далее часовые пояса. Лучше всего не использовать какой-либо часовой пояс, используйте универсальное скоординированное время UTC (которое является универсальным временем и соответствует GMT без перехода на летнее время). UTC — это стандарт времени, широко используемый во всем мире. Мировые центры отсчета времени договорились о том, чтобы их шкалы времени были точно синхронизированы или скоординированы, поэтому название «Универсальное координированное время» (https://www.timeanddate.com/time/aboututc.html).

Итак, теперь у нас есть ясная картина. Чтобы преобразовать дату и время в unixtimestamp, выполните следующие действия:

// Saves your local set Timezone.
$saveDDTZ = date_default_timezone_get(); 
// Sets the timezone to UTC
date_default_timezone_set("UTC");
// Converts a date-time into a unix timestamp (= 1560470400).
$unixTS = strtotime( "2019-06-14 00:00:00 UTC");
// Restore the timezone
date_default_timezone_set($saveDDTZ");

Чтобы восстановить отметку времени unix до даты, используйте:

// Saves your local set Timezone.
$saveDDTZ = date_default_timezone_get(); 
// Sets the timezone to UTC
date_default_timezone_set("UTC");|
$unixTS = 1560470400
$dateTime = date("Y-m-d H:i:s", $unixTS);
// Restore the timezone
date_default_timezone_set($saveDDTZ");

Если вы хотите изменить дату UTC на часовой пояс, используйте разницу между UTC, часовым поясом и переходом на летнее время.

person Harm    schedule 14.06.2019