Как рассчитать интервал между 2 unix timestamps в php БЕЗ деления на 86400 (60 * 60 * 24) - PullRequest
4 голосов
/ 20 сентября 2010

У меня есть 2 метки времени Unix, я в Азиатско-Тихоокеанском регионе / часовом поясе Окленда (GMT + 12, DaylightSavings = GMT + 13)

Я хочу рассчитать количество дней с интервалом между 2 временными метками, где одна находится внутри летнего времени, а другая - нет.

Мой пример даты

7 Feb 2009 (1233925200) до 21 September 2010 (1284985360) (не включая 21-е) смотри здесь написано 591 дней: http://www.timeanddate.com/date/durationresult.html?d1=7&m1=2&y1=2009&d2=21&m2=9&y2=2010

Давайте посчитаем, вот мои метки времени (обе основаны на времени Окленда 00:00)

1284985360-1233925200 = 51060160
51060160 / 86400 = 590.974

Так что да, мне нужно 591. Я не хочу использовать решение «округления»

Есть ли надежный метод, такой как strtotime, но для вычисления интервалов дат, предпочтительно, для которого не требуется php 5.3+ минимум

РЕДАКТИРОВАТЬ: нужно уточнить, я использую STRTOTIME, чтобы получить эти метки времени, я думал, что это было UTC

РЕДАКТИРОВАТЬ 2: Я считаю, что я нашел проблему. Хотя моя конечная дата была 21 сентября, я фактически использовал time (), чтобы получить конечную дату, а time () возвращала неправильную метку времени, возможно, она не учитывает GMT + 12, несмотря на то, что я переключил time () на strtotime ( date ('d M Y')), и он вернул правильную метку времени! эврика 591 дней

Ура!

Ответы [ 3 ]

5 голосов
/ 20 сентября 2010

Рассчитайте количество полных дней для обеих временных меток, прежде чем вычислять разницу:

floor(1284985360 / 86400) - floor(1233925200 / 86400)

Ваш результат всегда является целым числом.

И так как вы используете strtotime дляполучить эти временные метки, укажите время 00:00:00+0000, чтобы всегда получить кратное 86400:

strtotime($str.' 00:00:00+0000')
2 голосов
/ 20 сентября 2010

Корректная временная метка Unix (POSIX) указана в UTC, поэтому вы начинаете со значений, которые уже неверны. Вы столкнулись с трудной битвой, поскольку API, как правило, предполагают, что метки времени находятся в UTC. Лучше всего это исправить, после чего простое деление действительно даст правильный результат.

0 голосов
/ 20 сентября 2010

Деление на 86400 надежно и легко.Я не знаю никаких специальных функций и не вижу причин, по которым они существуют.

...