#php #datetime #dst
#php #дата и время #летнее время
Вопрос:
Обычно в обычный день 1440 минут (60 мин / час * 24 часа). Однако из-за перехода на летнее время может быть либо 1380 минут (60 мин / час * 23 часа), либо 1500 минут (60 мин / час * 25 часов).
Как можно найти точное количество минут на заданную дату при наличии объекта DateTime в php?
Например, 13 марта 2016 года в США начинается летнее время (и, следовательно, 23-часовой рабочий день), а 6 ноября 2016 года в США заканчивается летнее время (и, следовательно, 25-часовой рабочий день). 1 мая 2016 года — обычный 24-часовой рабочий день. Я хотел бы иметь функцию, которая возвращала бы следующее:
$lomg= new DateTime('November 6, 2016T07:23:11');
$short= new DateTime('March 13, 2016T19:17:53');
$regular = new DateTime('May 1, 2016T22:45:00');
getMinutes($short); // Returns 1380
getMinutes($long); // Returns 1500
getMinutes($regular); // Returns 1440
Комментарии:
1. Хорошо, прекратите использовать временные метки unix, если вы можете их избежать, потому что все они основаны на UTC; и начните использовать объекты DateTime, которые на самом деле знают часовой пояс
2. Можно ли узнать, действует ли в настоящее время летнее время, используя
(bool)$dateTimeObject->format('I')
.3. Временная метка unix не содержит никаких данных о часовом поясе. Это UTC и не имеет настроек DST. Вы должны преобразовать время (например, с помощью классов DateTime() и DateTimeZone() в php) внутренне в правильный часовой пояс, и он автоматически скорректируется на летнее время и смещение часового пояса на основе даты.
4.
DST starts in the US (and thus is a 25 hour day)
— эм, нет, это 23-часовой рабочий день:print (strtotime('14 March 2016')-strtotime('13 March 2016'))/3600
(после правильной настройки часового пояса). И вы путаете данные и интервалы.5. Вы все правы, и я испортил свой первоначальный вопрос. Я действительно работаю с объектом DateTime, а не с меткой времени. Я соответствующим образом отредактировал свой вопрос. Извините за путаницу.
Ответ №1:
Следующее должно (в принципе) работать:
<?php
$dt = new DateTime();
$dt->setTimestamp(1457827200);
$dt->modify("today"); //Set to 00:00:00
$dt2 = clone $dt; // Copy to new instance
$dt2->modify(" 1 day");
var_dump(($dt2->getTimestamp() - $dt->getTimestamp())/60);
(Полный отказ от ответственности, не тестировал)