PHP: вычисление дней с момента события и секунд с полуночи

#php #datetime #datediff

#php #datetime #datediff

Вопрос:

Это проблема из двух частей, которая должна быть тривиальной, но обработка даты и времени в PHP, похоже, совсем не так, и все, что я пробовал до сих пор, либо давало неправильные результаты, либо приводило к сбою моей программы

Я пытаюсь воспроизвести следующие две команды SQL Server на PHP

  1. Подсчитайте дни с начала тысячелетия
     select (cast (DATEDIFF(day,'2000-01-01',getdate()) as int) 
     
  2. Подсчитайте количество секунд с полуночи
     datediff(second,convert(date,getdate()),getdate())
     

Я перепробовал все комбинации date_diff, getdate, strotime и многое другое, но, похоже, ничто не дает мне правильно отформатированную дату и время в формате ISO или работоспособный метод вычисления прошедших дней и секунд.

Я использую PHP7, поэтому все встроенные функции должны быть обновлены.

Чего мне не хватает?

редактировать: пример входных данных.

  1. сегодняшняя дата в формате ‘2020-11-22 16:57:10.112’ заданная дата в формате ‘2000-01-01 00:00:00.000’

ожидаемые выходные данные: 7631 дней

  1. сегодняшняя дата в формате ‘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 без параметра в свой ответ. Функция тысячелетия может быть изменена таким же образом. Я отредактирую, чтобы показать их оба.