CakeFest 2024: The Official CakePHP Conference

strtotime

(PHP 4, PHP 5, PHP 7, PHP 8)

strtotimeПреобразовывает текстовое представление даты на английском языке в метку времени Unix

Описание

strtotime(string $datetime, ?int $baseTimestamp = null): int|false

Первым параметром функция ожидает строку с датой на английском языке, которая будет преобразована в метку времени Unix (количество секунд, прошедших с 1 января 1970 года 00:00:00 UTC) относительно метки времени, переданной в параметр baseTimestamp, или текущего времени, если аргумент baseTimestamp опущен. Разбор строки даты определён в разделе «Форматы даты и времени» и содержит несколько тонких вопросов. Знание форматов упростит работу с функцией.

Внимание

Метка времени Unix, которую возвращает функция, не содержит данных о часовых поясах. Для расчётов с датой/временем обращаются к инструменту с бо́льшими способностями — классу DateTimeImmutable.

Каждый параметр функции будет использовать часовой пояс по умолчанию, если он не указан в нём. Соблюдают осторожность и не указывают разные метки времени в параметрах, если только так не было задумано. О способах установки часового пояса по умолчанию рассказано в описании функции date_default_timezone_get().

Список параметров

datetime

Строка даты и времени. Объяснение корректных форматов дано в разделе Форматы даты и времени.

baseTimestamp

Метка времени, которую функция будет использовать как основу для вычисления относительных дат.

Возвращаемые значения

Возвращает метку времени в случае успешного выполнения, иначе false.

Ошибки

Каждый вызов к функциям даты и времени при неправильных настройках часового пояса сгенерирует ошибку уровня E_WARNING, если часовой пояс некорректный. Смотрите также описание функции date_default_timezone_set().

Список изменений

Версия Описание
8.0.0 Теперь параметр baseTimestamp может принимать значение null.

Примеры

Пример #1 Пример использования функции strtotime()

<?php

echo strtotime("now"), "\n";
echo
strtotime("10 September 2000"), "\n";
echo
strtotime("+1 day"), "\n";
echo
strtotime("+1 week"), "\n";
echo
strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";
echo
strtotime("next Thursday"), "\n";
echo
strtotime("last Monday"), "\n";

Пример #2 Проверка ошибок

<?php

$str
= 'Not Good';

if ((
$timestamp = strtotime($str)) === false) {
echo
"Строка ($str) недопустима";
} else {
echo
"$str == " . date('l dS \o\f F Y h:i:s A', $timestamp);
}

Примечания

Замечание:

«Относительная» дата в данном случае также означает, что если конкретный компонент метки даты/времени не указан, он будет взят дословно из параметра baseTimestamp. То есть, вызов strtotime('February'), если его запустить 31 мая 2022 года, будет интерпретирован как 31 февраля 2022, что перенесётся в метку времени 3 марта (в високосный год будет 2 марта). Вызов strtotime('1 February') или strtotime('first day of February') не допустит этой проблемы.

Замечание:

Если количество лет указано двумя цифрами, то значения 00-69 будут считаться 2000-2069, а 70-99 — 1970-1999. Замечания ниже рассказывают о возможных различиях на 32-битных системах (допустимые даты заканчиваются 2038-01-19 03:14:07).

Замечание:

Корректный диапазон меток времени — это обычно даты с 13 декабря 1901 20:45:54 UTC по 19 января 2038 03:14:07 UTC. (Эти даты соответствуют крайним значениям 32-битного целого числа со знаком.)

В 64-битных версиях PHP корректный диапазон меток времени практически бесконечен, так как 64 битов хватит для представления около 293 миллиардов лет в обоих направлениях.

Замечание:

Использовать эту функцию для математических операций не рекомендовано. Лучше пользоваться методами DateTime::add() и DateTime::sub().

Смотрите также

add a note

User Contributed Notes 3 notes

up
9
Vyacheslav Belchuk
1 year ago
Be careful when using two numbers as the year. I came across this situation:

<?php

echo strtotime('24.11.22');
echo
date('d.m.Y H:i:s', 1669324282) . "\n\n";

// But
echo strtotime('24.11.2022');
echo
date('d.m.Y H:i:s', 1669237200);

?>

Output:

1669324282
25.11.2022 00:11:22

1669237200
24.11.2022 00:00:00
up
4
info at pipasjourney dot com
9 months ago
Be aware of this: 1 month before the 31st day, it will return the same month:

<?php
echo date('m', strtotime('2023-05-30 -1 month')) ; //returns 04
echo date('m', strtotime('2023-05-31 -1 month')) ; //returns 05, not 04
?>

So, don't use this to operate on the month of the result.
A better way to know what month was the previous month would be:

<?php
//considering today is 2023-05-31...

$firstOfThisMonth = date('Y-m') . '-01'; //returns 2023-05-01
echo date('m', strtotime($firstOfThisMonth . ' -1 month')) ; //returns 04
?>
up
0
et dot coder at gmail dot com
3 days ago
> The Unix timestamp that this function returns does not contain information about time zones. In order to do calculations with date/time information, you should use the more capable DateTimeImmutable.

important - does not contain

<?php
date_default_timezone_set
('Europe/Berlin');

// .... a lot of code

echo $a = strtotime('yesterday 00:00');

// in $a hour = 23:00:00 and you may not know about it
// https://onlinephp.io/c/ef696
// use DateTimeImmutable
To Top