2015-01-19 4 views
0

타임 스탬프 및 기타 정보를 기반으로 날짜를 계산하고 싶습니다. 샘플로날짜가 잘못된 날짜를주는 이유는 무엇입니까?

function getLastDeliveryDate($timestamp,$endOfMonth=true,$extraMonth=0){ 

    $days    = 0; 
    $extraDays   = 0; 
    $endOfCurrentMonth = 0; 
    $tsDay    = 86400; 

    if($endOfMonth){ 
     $endOfCurrentMonth = date("t", $timestamp) - date("d",$timestamp); 
     //rest of days in current month. In this sample 16 days 
    } 

    for($i=0;$i<$extraMonth;$i++){ 
     $x = $i + 1; 
     $date = new DateTime(date("Y-m-d", $timestamp)); //create dateobject to add a month 
     $date->modify("+{$x} month"); // add the month (next month) 
     $extraDays += date("t", strtotime($date->format("Y-m-d"))); 
     // get the days of the selected month and add them to count 
     // in this case its 31 + 30 + 31 = 92 
    } 

    $days = $endOfCurrentMonth + $extraDays; 
    // count everything together 16 + 92 = 108 days 

    return date("d.m.y", $timestamp + ($tsDay*$days)); 
    //returning date with 108 days added. 
} 

내가 같은 함수를 호출 : :

// the timestamp is 2015-07-15 
echo getLastDeliveryDate(1436911200, true, 3); 
// should return 2015-10-31 

그러나이 반환 2015-10-30을 내가 왜 모르겠

내 기능은 같다. 하지만 108 일간은 2015-10-31입니다. 여기서 뭐가 잘못 됐니? 나는 그것의 올바른

echo getLastDeliveryDate(1436911200, true, 2); 

를 호출하고

2015-09-30이 사실 나는에 allways 원하는 나에게 달의 마지막 날을 제공하는 경우

.

는 편집 :

유선, 나는 여기를 테스트하는 경우 : IDEONE 모든 작동합니다. 그것은 당신이 루프 전에 날짜 객체를 생성 할 필요가

+0

시간대 오프셋을 확인 하시겠습니까? – Mouser

+0

내가 이미 전달 된 타임 스탬프에 포함되어 있더라도? 기본 날짜가 맞고 반환 된 날짜도 올바르므로 그게 아니라고 생각해보십시오. 그래서 이것은 불가능합니다 ... timbugtu에도 24 시간 모두 있습니다 : D – Dwza

+0

정말로'$ endOfMonth'를 직접 손으로 설정합니까? ist는 무엇인가? 타임 스탬프가 해당 월의 마지막 날인지 여부를 확인하는 기계적이고 쉬운 방법이 있습니다. – ITroubs

답변

1

:(하지 않습니다 내 프로젝트 임 :.

$date = new DateTime(date("Y-m-d", $timestamp)); //create dateobject to add month 
// simpler alternative: $date = new DateTime("@$timestamp"); 
for($i=0;$i<$extraMonth;$i++){ 
    $date->modify("+1 month"); // add the month (next month) 
    // $extraDays += date("t", strtotime($date->format("Y-m-d"))); 
    // you can reduce this line to: 
    $extraDays += $date->format("t"); 
} 

// Result: 15-10-31 

가, 그렇지 않으면 당신은 타임 스탬프 + 1 달의 날짜를 사용하기 때문에 항상 (31)가 추가가

참고 :

이에 전체 기능을 줄일 수

function getLastDeliveryDate($timestamp,$endOfMonth=true,$extraMonth=0){ 
    $date = new DateTime("@$timestamp"); 
    $date->modify("+$extraMonth month"); 
    if ($endOfMonth) 
     $date->modify("last day of this month"); 
    return $date->format("d.m.y"); 
} 
+0

아니요, 맞습니다. 그것은 주어진 타임 스탬프에서 선택된 달의 날짜를 얻기 위해 루프에서 그것을 만들고 싶습니다. 이것이 내가 $ x를 가지고있는 이유입니다.하지만 맞습니다. $ x를 지우고 외부에서 호출 할 수 있습니다. 실제로 더 나은 코드입니다 :). – Dwza

+0

아니요, 같은 결과 – Dwza

+0

흠 ...아직도 맞을지 모르지만 ... 다른 문제가있는 것 같아요. 다른 곳에서 테스트 해보면 ... 올바른 결과를 얻을 수 있습니다. (어쨌든 thx. 내가 뭘했는지 알기 위해 노력하고있어. # – Dwza

1

문제는 일광 절약 시간입니다. 2015 년 10 월 25 일에 1 시간이 흘렀습니다. 타임 스탬프가 정확히 0:00:00이므로 1 시간 후에 '30.10.2015 23:00:00 '이 실제로 발생해야합니다. 0:00:00

function getLastDeliveryDate($timestamp,$endOfMonth=true,$extraMonth=0){ 

    $days = 0; 
    $extraDays = 0; 
    $endOfCurrentMonth = 0; 
    $tag = 86400; 
    if(date('H',$timestamp)==0){$timestamp+=3601;} 
    if($endOfMonth){ 
    $endOfCurrentMonth = date("t", $timestamp) - date("d",$timestamp); 
    } 

    $date = new DateTime(date("Y-m-d", $timestamp)); 
    for($i=0;$i<$extraMonth;$i++){ 
     $date->modify("+1 month"); 
     $extraDays += $date->format("t"); 
    } 

    $days = $endOfCurrentMonth + $extraDays; 
    return date("d.m.y", $timestamp + ($tag*$days)); 

} 

echo getLastDeliveryDate(1436911200, true, 3); 

이 코드는 datetime이 0:00:00으로 고정 된 경우 1 시간 1 초를 추가하여이 문제에 대한 더러운 수정 프로그램을 제공합니다. 시간을 신경 쓰지 않으면이 솔루션이 문제를 해결하고 어떤 경우에도 실행 가능합니다. 시간에 관심이 있다면 일광 절약 시간제인지 여부를 확인하고 그에 따라 행동해야합니다.

+0

그것은 매우 더러운 수정입니다. D ill는 여전히 답을 알기 때문에 +1을줍니다. 나는 시간에 대해 신경 쓰지 않습니다. 그러나 그렇습니다. 시간이 다가 갈 때가되었을 때가되었습니다. 그러나 Gerald의 해결책은 멋졌고 나의 근원을 또한 shinked : – Dwza

+0

당신 말이 맞습니다. 그의 해결책은 훨씬 나아졌습니다. 일광 절약 시간이 정말 좋은 일을 엉망으로 만들 수 있습니다 .... – ITroubs

관련 문제