Как можно использовать DateTime::modify() для установки значений секунд на 0?

Как можно обнулить значения секунд в объекте DateTime без использования устаревших подходов?
Я придумал два варианта решения, но они оба имеют недостатки. Также я попробовал использовать третий вариант, аналогичный обнулению даты, но он не сработал. Вот мой код:
```php
html::textPlainHeader();

$dt = new DateTime();
print_r((clone $dt)->setTimestamp(intdiv($dt->getTimestamp(), 60) * 60));

$dt = new DateTime();
print_r($dt->modify('-'.$dt->format('s').' sec')->modify('-'.$dt->format('u').' usec'));

$dt = new DateTime();
print_r($dt->modify('first second of this minute'));
```
  • 2 февраля 2024 г. 11:39
Ответы на вопрос 2
Если вам нужно обнулить секунды и микросекунды в объекте `DateTime`, вы можете использовать метод `setTime` с текущими часом и минутой, задав секунды и микросекунды в 0. Вот пример:

```php
$dt = new DateTime();
$dt->setTime($dt->format('H'), $dt->format('i'), 0); // Обнуление секунд
```

Коду необходимо добавить обнуление микросекунд, которое можно сделать, используя метод `DateTime::format` для получения текущих часов и минут, а затем использовать `DateTime::setTime` для установки часов, минут, секунд (0) и микросекунд (0):

```php
$dt = new DateTime();
$dt->setTime($dt->format('H'), $dt->format('i'), 0, 0); // Обнуление секунд и микросекунд
print_r($dt);
```

Таким образом, вы получите объект `DateTime` с текущим временем, но с обнулёнными секундами и микросекундами.

Ваш третий вариант с использованием `modify('first second of this minute')` не подходит для обнуления секунд, так как такая строка не распознаётся как валидный аргумент для изменения в методе `modify`.

В вашем втором примере кода вы один раз вычитаете секунды и один раз вычитаете микросекунды. Это работает, но возможно, метод `setTime` более предпочтителен, так как он позволяет напрямую установить желаемое время.

Первый вариант с использованием `setTimestamp` также верен, но потенциально может быть менее читаемым и интуитивно понятным, чем использование `setTime`.

Итак, наиболее чистый и понятный путь - использовать `setTime` с обнулением секунд и микросекунд:
```php
$dt = new DateTime(); // текущее время
$dt->setTime((int)$dt->format('H'), (int)$dt->format('i'), 0, 0); // обнуление секунд и микросекунд
echo $dt->format('Y-m-d H:i:s.u') . PHP_EOL; // вывод обнуленного времени
```
<?php
$dt = new DateTime();
print_r($dt->settime((int)$dt->format("H"), (int)$dt->format("i"), 0));
Похожие вопросы