- Математика с датой php
- Операции с датами и временем Unixtime в PHP
- Получение временных меток и дат
- Число дня недели
- Числа месяца
- Текущий месяц:
- Преведущий месяц:
- Следующий месяц:
- Число дней в текущем месяце
- Порядковый номер недели
- Число дней в текущем году
- Текущий квартал
- Арифметические операции
- Прибавить к дате 10 секунд
- Прибавить к дате 10 минут
- Прибавить к дате 1 час
- Прибавить к дате 1 день
- Прибавить к дате неделю
- Прибавить к дате месяц
- Прибавить к дате год
- Сколько прошло
- Сколько прошло c 8:00
- Сколько прошло c понедельника этой недели
- Сколько прошло c начала года
- Сколько прошло c определённой даты
- Сколько остается
- Сколько остается до 23:00
- Сколько остается до конца недели
- Сколько остается до конца месяца
- Сколько остается до конца года
- Сколько остается до определенной даты
- Время между датами
- Количество часов между датами
- Количество дней между датами
- Количество месяцев между датами
- Комментарии 2
- Другие публикации
- Арифметические операции с датами
- Решение
Математика с датой php
В следующих примерах показываются некоторые подводные камни вычислений даты/времени, относительно переходов на летнее и зимнее время (DST), и месяцев, имеющих разное количество дней.
Пример #1 DateTimeImmutable::add/sub добавляет интервалы, охватывающие прошедшее время
Добавление PT24H через переход DST приведёт к добавлению 23/25 часов (для большинства часовых поясов).
$dt = new DateTimeImmutable ( «2015-11-01 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> add (new DateInterval ( «PT3H» ));
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?>?php
Результат выполнения данного примера:
Начало: 2015-11-01 00:00:00 -04:00 Конец: 2015-11-01 02:00:00 -05:00
Пример #2 DateTimeImmutable::modify и strtotime увеличит или уменьшит значения индивидуальных компонентов
Добавление +24 часов через переход DST добавит точно 24 часов (вместо учёта перехода на зимнее или летнее время).
$dt = new DateTimeImmutable ( «2015-11-01 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> modify ( «+24 hours» );
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?>?php
Результат выполнения данного примера:
Начало: 2015-11-01 00:00:00 -04:00 Конец: 2015-11-02 00:00:00 -05:00
Пример #3 Добавление или вычитание времени может уменьшить или увеличить дату
Например, 31 января + 1 месяц вернёт 2 марта (високосный год) или 3 марта (обычный год).
echo «Обычный год:\n» ; // В феврале 28 дней
$dt = new DateTimeImmutable ( «2015-01-31 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> modify ( «+1 month» );
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?php
echo «Високосный год:\n» ; // В феврале 29 дней
$dt = new DateTimeImmutable ( «2016-01-31 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> modify ( «+1 month» );
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?>
Результат выполнения данного примера:
Обычный год: Начало: 2015-01-31 00:00:00 -05:00 Конец: 2015-03-03 00:00:00 -05:00 Високосный год: Начало: 2016-01-31 00:00:00 -05:00 Конец: 2016-03-02 00:00:00 -05:00
Для получения последнего дня следующего месяца (то есть чтобы предотвратить переполнение) существует директива last day of .
echo «Обычный год:\n» ; // Февраль содержит 28 дней
$dt = new DateTimeImmutable ( «2015-01-31 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> modify ( «last day of next month» );
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?php
echo «Високосный год:\n» ; // Февраль содержит 29 дней
$dt = new DateTimeImmutable ( «2016-01-31 00:00:00» , new DateTimeZone ( «America/New_York» ));
echo «Начало: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
$dt = $dt -> modify ( «last day of next month» );
echo «Конец: » , $dt -> format ( «Y-m-d H:i:s P» ), PHP_EOL ;
?>
Результат выполнения данного примера:
Обычный год: Начало: 2015-01-31 00:00:00 -05:00 Конец: 2015-02-28 00:00:00 -05:00 Високосный год: Начало: 2016-01-31 00:00:00 -05:00 Конец: 2016-02-29 00:00:00 -05:00
Операции с датами и временем Unixtime в PHP
Unix-время (англ. Unix time, также POSIX-время) — система описания моментов во времени. Определяется как количество секунд, прошедших с полуночи 1 января 1970 года.
В PHP текущую метку времени возвращает функция time() и функция strtotime(), также с unix-метками работает класс DateTime.
Получение временных меток и дат
Число дня недели
// Понедельник текущей недели: $time = strtotime('this week monday, 00:00'); echo date('d.m.Y H:i', $time); // 17.07.2023 00:00 // Понедельник предыдущий недели: $time = strtotime('previous week monday, 00:00'); echo date('d.m.Y H:i', $time); // 10.07.2023 00:00 // Понедельник следующей недели: $time = strtotime('next monday, 00:00'); echo date('d.m.Y H:i', $time); // 24.07.2023 00:00
Числа месяца
Текущий месяц:
// Первый день текущего месяца: $time = strtotime('first day of this month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.07.2023 00:00:00 // Последний день текущего месяца: $time = strtotime('last day of this month 23:59'); echo date('d.m.Y H:i:s', $time); // 31.07.2023 23:59:00
Преведущий месяц:
// Первый день предыдущего месяца: $time = strtotime('first day of previous month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.06.2023 00:00:00 // Последний день предыдущего месяца: $time = strtotime('last day of previous month 23:59'); echo date('d.m.Y H:i:s', $time); // 30.06.2023 23:59:00
Следующий месяц:
// Первый день следующего месяца: $time = strtotime('first day of next month 00:00'); echo date('d.m.Y H:i:s', $time); // 01.08.2023 00:00:00 // Последний день следующего месяца: $time = strtotime('last day of next month 23:59'); echo date('d.m.Y H:i:s', $time); // 31.08.2023 23:59:00
Число дней в текущем месяце
Порядковый номер недели
Число дней в текущем году
echo date('L') ? 366 : 365; // 365
Текущий квартал
echo intval((date('n') + 2) / 3); // 3
Арифметические операции
Для сложения и вычитания времени можно применить функцию strtotime() или просто работать с секундами:
1 минута | 60 секунд | 10 минут | 600 секунд |
1 час | 3600 секунд | 10 часов | 36000 секунд |
1 день | 86400 секунд | 2 дня | 172800 секунд |
1 неделя | 604800 секунд | 2 недели | 1209600 секунд |
1 месяц | 2629743 секунд | 2 месяца | 5259486 секунд |
1 год | 31556926 секунд | 2 года | 63072000 секунд |
Прибавить к дате 10 секунд
$time = time() + 10; echo date('d.m.Y H:i:s', $time); // 19.07.2023 15:58:38 /* или */ $time = strtotime('+10 seconds', time()); echo date('d.m.Y H:i:s', $time); // 19.07.2023 15:58:38
Прибавить к дате 10 минут
$time = time() + 600; echo date('d.m.Y H:i:s', $time); // 19.07.2023 16:08:28 /* или */ $time = strtotime('+10 minutes', time()); echo date('d.m.Y H:i:s', $time); // 19.07.2023 16:08:28
Прибавить к дате 1 час
$time = time() + 3600; echo date('d.m.Y H:i:s', $time); // 19.07.2023 16:58:28 /* или */ $time = strtotime('+1 hours', time()); echo date('d.m.Y H:i:s', $time); // 19.07.2023 16:58:28
Прибавить к дате 1 день
$time = time() + 86400; echo date('d.m.Y H:i:s', $time); // 20.07.2023 15:58:28 /* или */ $time = strtotime('+1 days', time()); echo date('d.m.Y H:i:s', $time); // 20.07.2023 15:58:28
Прибавить к дате неделю
$time = strtotime('+1 week', time()); echo date('d.m.Y H:i:s', $time); // 26.07.2023 15:58:28
Прибавить к дате месяц
$time = strtotime('+1 month', time()); echo date('d.m.Y H:i:s', $time); // 19.08.2023 15:58:28
Прибавить к дате год
$time = strtotime('+1 year', time()); echo date('d.m.Y H:i:s', $time); // 19.07.2024 15:58:28
Сколько прошло
Сколько прошло c 8:00
$date = date('d.m.Y 08:00'); $diff = time() - strtotime($date); echo round($diff / 3600, 1); // 8 часов
Сколько прошло c понедельника этой недели
$time = strtotime('monday'); $diff = time() - $time; echo round($diff / 3600); // 64 часов echo round($diff / 86400, 1); // 2,7 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько прошло c начала года
$date = date('01.01.Y 00:00:00'); $diff = time() - strtotime($date); echo intval($diff / 86400); // 199 дней // или echo date('z'); // 199
Сколько прошло c определённой даты
$date = '10.08.2016'; $diff = time() - strtotime($date); echo round($diff / 3600); // 60832 часов echo round($diff / 86400); // 2535 дней
Сколько остается
Сколько остается до 23:00
$time = strtotime(date('d.m.Y 23:00')); $diff = $time - time(); echo round($diff / 3600, 1); // 7 часов
Сколько остается до конца недели
$date = strtotime('next sunday, 23:59'); $diff = $date - time(); echo round($diff / 3600); // 104 часов echo round($diff / 86400); // 4 дней
*Дни недели: monday, tuesday, wednesday, thursday, friday, saturday, sunday.
Сколько остается до конца месяца
$time = strtotime(date('Y-m-t 23:59')); $diff = $time - time(); echo round($diff / 3600); // 296 часов echo round($diff / 86400); // 12 дней
Сколько остается до конца года
$time = strtotime(date('Y-12-31 23:59')); $diff = $time - time(); echo round($diff / 3600); // 3968 часов echo round($diff / 86400); // 165 дней
Сколько остается до определенной даты
$date = '10.08.2025'; $diff = strtotime($date) - time(); echo round($diff / 3600); // 18056 часов echo round($diff / 86400); // 752 дней
Время между датами
Количество часов между датами
$date_1 = '01.01.2021 10:00'; $date_2 = '10.03.2021 18:00'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 3600); // 1640
Количество дней между датами
$date_1 = '01.01.2021 10:00'; $date_2 = '10.03.2021 18:00'; $seconds = abs(strtotime($date_1) - strtotime($date_2)); echo round($seconds / 86400, 1); // 68,3
Количество месяцев между датами
$date_1 = strtotime('01.01.2021 10:00'); $date_2 = strtotime('10.03.2021 18:00'); $months = 0; while (strtotime('+1 month', $date_1) < $date_2) < $months++; $date_1 = strtotime('+1 month', $date_1); >$days = round(($date_2 - $date_1) / (60 * 60 * 24)); echo $months . ' месяца, ' . $days . ' дней'; // 2 месяца, 9 дней
Комментарии 2
Специально не поленился и авторизовался, чтобы выразить благодарность авторам сайта, молодцы ребята! Неоднократно на вашем сайте получал именно нужную инфу, у вас все примеры разжеваны, с разными вариантами, не то что где нибудь найдешь вроде то, что тебе нужно и потом полдня думаешь, как под свою задачу это допилить. В данном случае мне нужно было кол-во дней между датами, при чем число должно быть дробным — то есть 3.6 дня, например. У вас нашел, скопировал, и вставил (только имена переменных поменял), все. Именно то, что нужно. И так бывало уже не раз. В общем, спасибо, и обязательно продолжайте в том же духе!
Авторизуйтесь, чтобы добавить комментарий.
Другие публикации
Заголовок Last-Modified помогает оптимизировать загрузку web-страниц и облегчить работу поисковым роботам.
Арифметические операции с датами
Здравствуйте!
У меня такой вопрос
Мне нужно проводить арифметичские операции с датами. Например, нужно закономерность в семь дней(или одну неделю)
$a=1967.08.09;
$b=$a-7;
echo выдает 1960
Оно отнимает число 7 от порядкового числа года, а не ото дня месяца, как мне нужно.
Отсюда возникает вопрос: есть ли специальные функции для проведения арифметических с датами? в мануале не нашел.
Заранее спасибо!
Арифметические действия с датами
Всем доброго времени суток. Хочу сделать на сайте строку, которая будет показывать, сколько.
Элементарные арифметические операции
есть база DB таблица 1 kurs +=========+=======+ | kurs_doll___| kurs_euro| таблица 2.
Арифметические действия с датами
1) Необходимо найти самый новый файл по названию 2) Затем определить его дату изменения 3) И.
Арифметические действия с датами
Вообщем есть у меня программа которая точно высчитывает разницу дней между нынешней датой, и.
Сообщение было отмечено Novichok PHP как решение
Решение
Сообщение от Novichok PHP
Здравствуйте!
У меня такой вопрос
Мне нужно проводить арифметичские операции с датами. Например, нужно закономерность в семь дней(или одну неделю)
$a=1967.08.09;
$b=$a-7;
echo выдает 1960
Оно отнимает число 7 от порядкового числа года, а не ото дня месяца, как мне нужно.
Отсюда возникает вопрос: есть ли специальные функции для проведения арифметических с датами? в мануале не нашел.
Заранее спасибо!
..»Функцию mktime() удобно использовать для выполнения арифметических операций с датами, так как она вычисляет верные значения при некорректных аргументах. Например, в следующем примере каждая строка выведет «Jan-01-1998«.
Пример 1. Пример использования функции mktime()
echo date("M-d-Y", mktime(0, 0, 0, 12, 32, 1997)); echo date("M-d-Y", mktime(0, 0, 0, 13, 1, 1997)); echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 1998)); echo date("M-d-Y", mktime(0, 0, 0, 1, 1, 98)); ?>
Year может быть двух- или четырехзначным числом. Значения от 0 до 69 соответствуют 2000-2069, а 70-99 соответствуют 1970-1999 (в большинстве современных систем, где время представляется 32-битным целым со знаком, допустимыми являются значения year между 1901 и 2038). . «
Пример 2. Last day of next month
$lastday = mktime(0, 0, 0, 3, 0, 2000); echo strftime("Последний день в феврале 2000 г:: %d", $lastday); $lastday = mktime(0, 0, 0, 4, -31, 2000); echo strftime("Последний день в феврале 2000 г:: %d", $lastday); ?>