Работа с датой и временем

13 окт. 2015 г.
(обновлено 3 нояб. 2017 г.)

Текущие дата и время в указанном формате.

date('l, Y-m-d H:i:s');

То же самое, но c отметкой актуальной временной зоны.

date('l, Y-m-d H:i:sP');

Выводит

Thursday, 2018-11-15 04:47:14+02:00

То же самое, но в заданной временной зоне (PHP 5.2+).

$date = new DateTime(null, new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d H:i:sP');

2018-11-14 21:47:14-05:00

Использование метки времени UNIX (результат в UTC, указание временной зоны не работает; PHP 5.2+)

$date = new DateTime('@1000000000');
echo $date->format('Y-m-d H:i:s');

2001-09-09 01:46:40

Получить временную метку UNIX в микросекундах

echo microtime(true);

Без параметра true вернет string.

Получить временную метку UNIX в секундах

echo time();

Получить временную метку UNIX в секундах для произвольных даты и времени (в данном случае для 5-04-2006 01:02:03)

echo mktime(1, 2, 3, 4, 5, 2006);

Отформатировать дату/время с учетом текущих настроек локали

Получить временную зону (PHP 5.2+)

$date = new DateTime();
$tz = $date->getTimezone();
echo $tz->getName();

Распарсить информацию о дате и времени в ассоциативный массив.

print_r(getdate());
Array
(
    [seconds] => 14
    [minutes] => 47
    [hours] => 4
    [mday] => 15
    [wday] => 4
    [mon] => 11
    [year] => 2018
    [yday] => 318
    [weekday] => Thursday
    [month] => November
    [0] => 1542250034
)

Распарсить информацию о дате и времени в ассоциативный массив (PHP 5.2+)

print_r(date_parse(date('Y-m-d H:i:s')));
Array
(
    [year] => 2018
    [month] => 11
    [day] => 15
    [hour] => 4
    [minute] => 47
    [second] => 14
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

То же самое, но с датой в определенном формате (PHP 5.3+)

print_r(date_parse_from_format("j.n.y H:i", '3.2.77 2:10'));

Преобразовать текущее локальное время/дату в число (в качестве формата принимается только один символ; PHP 5)

echo idate('s');

То же самое с произвольной датой (PHP 5)

echo idate('m', strtotime('2001-09-11'));
Array
(
    [year] => 1977
    [month] => 2
    [day] => 3
    [hour] => 2
    [minute] => 10
    [second] => 0
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

Работа с интервалами (начиная с PHP 5.3)

Добавить один день к заданной дате

$date = new DateTime('2001-01-01');
$date->add(new DateInterval('P10D'));
echo $date->format('Y-m-d');

2001-01-02

Добавить 13 часов к заданной дате

$date = new DateTime('2001-01-01');
$date->add(new DateInterval('PT13H'));
echo $date->format('Y-m-d H:i:s');

2001-01-02 13:00:00

Добавить 13 лет, 6 месяцев, 13 дней, 13 часов, 13 минут и 13 секунд к заданной дате

$date = new DateTime('2001-01-01');
$date->add(new DateInterval('P13Y6M13DT13H13M13S'));
echo $date->format('Y-m-d H:i:s');

2014-07-14 13:13:13

Аналогично отнять

$date = new DateTime('2001-01-01');
$date->sub(new DateInterval('P10D'));
echo $date->format('Y-m-d');

2000-12-31

Работа с периодами (PHP 5.3+)

$start = new DateTime('2015-12-01');
$interval = new DateInterval('P10D');
$end = new DateTime('2015-12-31');
$recurrences = 3;
$iso = 'R3/2015-12-01T00:00:00Z/P10D';

// Эти периоды эквивалентны.
$period = new DatePeriod($start, $interval, $recurrences);
$period = new DatePeriod($start, $interval, $end);
$period = new DatePeriod($iso);

// При переборе экземпляра DatePeriod в цикле будут отображены все отобранные даты
// периода.
foreach ($period as $date) {
    echo $date->format('Y-m-d')."\n";
}

Если не нужно отображать первую дату

$period = new DatePeriod($start, $interval, $end,
    DatePeriod::EXCLUDE_START_DATE);