@KOPC1886

Почему DateTime некорректно отрабатывает?

Всем привет!

Почему DateTime так отрабатывает? Вот пример

$startTimestamp = strtotime('01.10.2014');
$endTimestamp = strtotime('10.10.2014');

$begin = new DateTime("@".$startTimestamp);
$end = new DateTime("@".$endTimestamp);

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    var_dump($date->format("d.m.Y"));
}

Возвращаются даты с 30.09.2014 по 08.10.2014

Почему не с 01.10.2014 по 10.10.2014 ?
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 4
@krypt3r
Замечание:

Значение аргумента $timezone равно как и текущая временная зона не будут учитываться, если в качестве аргумента $time передается метка времени UNIX (например @946684800) или время, в котором временная зона уже содержится (например 2010-01-28T15:00:00+02:00).
Ответ написан
Комментировать
alsopub
@alsopub
Вероятно где-то закрадывается поправка на часовой пояс.
Попробуйте добавить время 12:00:00 чтобы поправка на часовой пояс не переходила через сутки.

$startTimestamp = strtotime('01.10.2014 12:00:00');
$endTimestamp = strtotime('10.10.2014 12:00:00');

$begin = new DateTime("@".$startTimestamp);
$end = new DateTime("@".$endTimestamp);

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    var_dump($date->format("d.m.Y"));
}


либо добавить одну строку

date_default_timezone_set('UTC');

$startTimestamp = strtotime('01.10.2014');
$endTimestamp = strtotime('10.10.2014');

$begin = new DateTime("@".$startTimestamp);
$end = new DateTime("@".$endTimestamp);

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval ,$end);

foreach($daterange as $date){
    var_dump($date->format("d.m.Y"));
}
Ответ написан
@mantyr
Пишу много Golang кода с удовольствием:)
Не надо передавать в new DateTime() timestamp, туда нужно отправлять обычный текстовый вариант даты.

<?php
$timezone = new DateTimeZone("Europe/Moscow");

$start = new DateTime("01-10-2014 00:00:00", $timezone);
$stop  = new DateTime("10-10-2014 24:00:00", $timezone);

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($start, $interval ,$stop);

foreach($daterange as $date){
    var_dump($date->format("d.m.Y"));
}


string(10) "01.10.2014"
string(10) "02.10.2014"
string(10) "03.10.2014"
string(10) "04.10.2014"
string(10) "05.10.2014"
string(10) "06.10.2014"
string(10) "07.10.2014"
string(10) "08.10.2014"
string(10) "09.10.2014"
string(10) "10.10.2014"


При этом обратите внимание на вторую дату, там время 24:00:00 для того что бы весь день учитывался, иначе дату 10.10.2014 получить было бы нельзя, впрочем, достаточно указать даже одну секунду что бы день засчитался (10-10-2014 00:00:01)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы