#php #datetime #datediff
#php #datetime #datediff
Вопрос:
Это проблема из двух частей, которая должна быть тривиальной, но обработка даты и времени в PHP, похоже, совсем не так, и все, что я пробовал до сих пор, либо давало неправильные результаты, либо приводило к сбою моей программы
Я пытаюсь воспроизвести следующие две команды SQL Server на PHP
- Подсчитайте дни с начала тысячелетия
select (cast (DATEDIFF(day,'2000-01-01',getdate()) as int)
- Подсчитайте количество секунд с полуночи
datediff(second,convert(date,getdate()),getdate())
Я перепробовал все комбинации date_diff, getdate, strotime и многое другое, но, похоже, ничто не дает мне правильно отформатированную дату и время в формате ISO или работоспособный метод вычисления прошедших дней и секунд.
Я использую PHP7, поэтому все встроенные функции должны быть обновлены.
Чего мне не хватает?
редактировать: пример входных данных.
- сегодняшняя дата в формате ‘2020-11-22 16:57:10.112’ заданная дата в формате ‘2000-01-01 00:00:00.000’
ожидаемые выходные данные: 7631 дней
- сегодняшняя дата в формате ‘2020-11-22 16:57:10.112’ предыдущая полночь в формате ‘2020-11-22 00:00:00.000’
ожидаемые выходные данные: 61215 секунд
Комментарии:
1. Не могли бы вы предоставить пример входных данных и желаемые результаты?
2. И примечание: тысячелетие на самом деле начинается
2001-01-01
. Не знаю, имеет ли это отношение к коду или вам конкретно нужен 2000 год.3. отредактировано с помощью примера. Мне конкретно нужен 2000 год
4. Только один лакомый кусочек информации: количество секунд должно быть 61030 за указанное вами время.
Ответ №1:
Это довольно легко сделать, если вы знаете свой путь вокруг даты и времени:
function daysSinceStartOfMillennium(DateTimeImmutable $date): int
{
$millenniumStart = new DateTimeImmutable('2000-01-01');
return $date->diff($millenniumStart)->days;
}
function secondsSinceMidnightOfDate(DateTimeImmutable $date): int
{
$midnightToday = new DateTimeImmutable('today');
$diff = $date->diff($midnightToday);
return $diff->s // seconds
$diff->i * 60 // minutes to seconds
$diff->h * 60 * 60 // hours to seconds
;
}
Вы также можете изменить функции, чтобы принимать строки даты в качестве аргументов и создавать внутри них объект DateTime.
Я решил создать описательную переменную внутри функции millennium, чтобы лучше передать решение. При желании создание этой переменной можно опустить, а аргумент передать непосредственно в оператор return:
return $date->diff(new DateTimeImmutable('2000-01-01'))->days;
Обратите внимание, что если вам нужно использовать эти функции только для текущей даты, их можно упростить, чтобы они не принимали аргументов:
function daysSinceStartOfMillennium(): int
{
$millenniumStart = new DateTimeImmutable('2000-01-01');
return (new DateTimeImmutable())->diff($millenniumStart)->days;
}
function secondsSinceMidnight(): int
{
$midnightToday = new DateTimeImmutable('today');
$diff = (new DateTimeImmutable())->diff($midnightToday);
return $diff->s // seconds
$diff->i * 60 // minutes to seconds
$diff->h * 60 * 60 // hours to seconds
;
}
Комментарии:
1. откуда берется сегодняшняя дата (та, которая передается в качестве параметра $date? т.е. Как мне вызвать функцию с сегодняшней датой и временем?
2. @pickarooney Это очень сильно зависит от вашего приложения. Вы выбираете, что должно быть передано функции.
3. Я хочу передать ему текущую дату и время, а для php вычислить, что это за значение. Я думаю, что у меня это есть, мне нужно создать переменную $now = new DateTimeImmutable() без параметров и передать ее ей.
4. @pickarooney Я уже включил пример
secondsSinceMidnight
без параметра в свой ответ. Функция тысячелетия может быть изменена таким же образом. Я отредактирую, чтобы показать их оба.