Получение точного количества минут заданной даты

#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);
 

(Полный отказ от ответственности, не тестировал)