2011-09-30 2 views
0

달력의 특정 날짜부터 X 일마다 얻으려고합니다. 나는 논리적 인 논리를 어느 정도 가지고 있다고 생각하지만, 작은 창에 대해서는 예기치 않은 결과가 나타납니다. 아래에있는 내 프로젝트에서 촬영PHP : 일정, 반복 일정의 모든 X 주

내 코드 :

$start_time = 1345935600; //Sept 25th 2011; 
$end_time = 1355011200; //Dec 9th 2011; 

$sStartDate = date("Y-m-d", $start_time) . " " . date("H:i:s", strtotime("00:00:00")); 
$sEndDate = date("Y-m-d", $end_time) . " " . date("H:i:s", strtotime("00:00:00")); 
$sCurrentDate = $sStartDate; 

while($sCurrentDate < $sEndDate) 
{          
    $t_date = strtotime($sCurrentDate); 
    $s_date = strtotime(date("Y-m-d", strtotime("08/30/2011"))); 

    $recurs_every = 60 * 60 * 24 * 2; //occurs every 2 days 

    echo date("Y-m-d H:i:s", $t_date) . " " . date("Y-m-d H:i:s", $s_date) . " " . (($t_date - $s_date) % $recurs_every) . " " . $recurs_every . "<BR>" ; 

    $sCurrentDate = date("Y-m-d", strtotime("+1 day", strtotime($sCurrentDate)));            
} 

출력 (현재 날짜 - 날짜 시작 - 모듈 형) :

2011-09-25 00:00:00 2011-08-30 00:00:00 0 
2011-09-26 00:00:00 2011-08-30 00:00:00 86400 
.... 
2012-10-27 00:00:00 2011-08-30 00:00:00 0 
2012-10-28 00:00:00 2011-08-30 00:00:00 86400 
2012-10-29 00:00:00 2011-08-30 00:00:00 3600 
2012-10-30 00:00:00 2011-08-30 00:00:00 90000 
2012-10-31 00:00:00 2011-08-30 00:00:00 3600 
2012-11-01 00:00:00 2011-08-30 00:00:00 90000 
2012-11-02 00:00:00 2011-08-30 00:00:00 3600 
2012-11-03 00:00:00 2011-08-30 00:00:00 90000 
2012-11-04 00:00:00 2011-08-30 00:00:00 3600 
2012-11-05 00:00:00 2011-08-30 00:00:00 90000 

마지막 몇 줄이 나를 위해 문제입니다.

3600은 1 시간이며 어디에서 발생하는지 알 수 없습니다. 이상한 일은 2012 년 3 월 26 일로 빨리 감기하고 다시 작동하기 시작하지만 10 월 29 일에 같은 오류가 발생합니다 ...

나는 몇 시간 동안이 시간을 보았습니다. 도움이 정말 감사! 시계가 한 시간으로 변환됩니다 여름 & 겨울 시간이

감사 일부 contries에에서

답변

0

(3월 27일 @ & 10월 30일). 그러므로 1 시간 차이가 있습니다. 나는 질문 노력에 응답 당신에게 해답을 준

<? 

error_reporting(E_ALL); 

$start_time = 1345935600; //Sept 25th 2011; 
$end_time = 1355011200; //Dec 9th 2011; 

$sStartDate = date("Y-m-d", $start_time) . " " . date("H:i:s", strtotime("00:00:00")); 
$sEndDate = date("Y-m-d", $end_time) . " " . date("H:i:s", strtotime("00:00:00")); 
$sCurrentDate = $sStartDate; 

$lastDate = 0; 
$corr = 0; 

while($sCurrentDate < $sEndDate) 
{          
    $t_date = strtotime($sCurrentDate); 
    $s_date = strtotime(date("Y-m-d", strtotime("08/30/2011"))); 

    $recurs_every = 60 * 60 * 24 * 2; //occurs every 2 days 

    echo date("Y-m-d H:i:s", $t_date) . " " . date("Y-m-d H:i:s", $s_date) . " " . (($t_date - $s_date + $corr) % $recurs_every) . " " . $recurs_every . "<BR>" ; 

    $lastDate = strtotime($sCurrentDate); 
    $sCurrentDate = date("Y-m-d", strtotime("+1 day", strtotime($sCurrentDate)));    

    if(strtotime($sCurrentDate) - $lastDate != 60 * 60 * 24) { 
     $corr -= strtotime($sCurrentDate) - $lastDate - 60 * 60 * 24; 
    } 
} 

?> 
+0

나는 그것과 관련이있을 것이라고 생각했습니다. 내 뇌가 지금은 멍청 해. 이 문제를 해결하기 위해 코드를 업데이트 할 수 있습니까? – PaulM

+0

내 게시물을 편집했습니다. 이런 식으로해야합니다. 아마도 가장 좋은 해결책은 아니지만 작동해야합니다 (테스트에서 그렇습니다). – MasterCassim

0

:>http://en.wikipedia.org/wiki/Daylight_saving_time

예 -

. 결국, 나는 다시 생각해 보았고 더 많은 인터넷 검색을 수행했고 이것은 내가 생각해내는 것입니다.

$start_time = 1316905200; 
$end_time = 1320537600; 

$sStartDate = date("Y-m-d", $start_time); 
$sEndDate = date("Y-m-d", $end_time); 

$sStartDate = new DateTime($sStartDate); 
$sEndDate = new DateTime($sEndDate); 

$sCurrentDate = $sStartDate; 
$recurs_every = 60 * 60 * 24 * 2; //occurs every 2 days 

while($sCurrentDate->format('U') < $sEndDate->format('U')) 
{  
    $s_date = new DateTime("08/30/2011"); 

    echo $sCurrentDate->format('Y-m-d') . " " . $s_date->format('Y-m-d') . " " . ceil(($sCurrentDate->format('U') - $s_date->format('U') - (chkTransitions($sCurrentDate->format('U')) == 'GMT' ? 3600 : 0)) % $recurs_every) . "<BR>"; 

    $sCurrentDate->add(new DateInterval('P1D'));  
} 

function chkTransitions($dt) 
{ 
    $timezone = new DateTimeZone("Europe/London"); 
    $transitions = $timezone->getTransitions($dt, $dt); 

    $offset = $transitions[0]['offset']; 
    $abbr = $transitions[0]['abbr']; 

    return $abbr; 
} 
관련 문제