문제

이것은 어제 코드를 변경하지 않고 잘 작동했습니다.

echo date("M", strtotime("-3 month", time()) );
echo date("M", strtotime("-2 month", time()) );
echo date("M", strtotime("-1 month", time()) );
echo date("M", time());

어제 생산 한 결과는 예상대로 예상했던 것과 같았습니다.

오늘은 5 월 7 월 7 월 7 월에 반향합니다

어떤 아이디어?

미리 감사드립니다.

도움이 되었습니까?

해결책

버그와 관련이있을 수 있습니다 #44073

당신은 다음과 같은 것을 시도 할 수 있습니다.

echo date("M", strtotime("-3 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-2 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", strtotime("-1 month", strtotime(date("F") . "1")) ) . "\n";
echo date("M", time()) . "\n";

(솔루션의 주석 섹션에서 찾은 솔루션 strtotime ; 직접 링크)

그리고 출력 :

Apr
May
Jun
Jul

날짜 형식과 달의 이름을 가진 "속임수"의 종류와 그 모든 것 ...

다른 팁

Gorden 은이 문제를 올바르게 식별했지만 기술적이지 않은 다른 솔루션을 제공하고 싶었습니다. "첫날"또는 "마지막 날의 마지막 날"을 사용하십시오. 예, 다음 예제는 한 달의 31 일 에이 문제를 극복합니다.

// Today is May 31st
//All the following return 2012-04-30
echo date('Y-m-d', strtotime("last day of -1 month"));
echo date('Y-m-d', strtotime("last day of last month"));
echo date_create("last day of -1 month")->format('Y-m-d'); 

// All the following return 2012-04-01
echo date('Y-m-d', strtotime("first day of -1 month")); 
echo date('Y-m-d', strtotime("first day of last month"));
echo date_create("first day of -1 month")->format('Y-m-d');

대신 이것을 시도하십시오 strtotime:

mktime(0, (date("n") - 3 + 12) % 12, 1)

아이디어는 현재 달 번호를 취하는 것입니다 (date("n")), 원하는 개월을 보증합니다 (여기 -3)), 12를 추가 한 다음 모듈로 12를 가져옵니다.

이것은 알려져 있고 예상되는 행동입니다. 그 이유는 a 고정 길이가없는 상대 날짜입니다. 에서 http://www.gnu.org/software/tar/manual/html_node/relative-items-in-date-strings.html#sec120

시간 단위 변위는 몇 년 또는 몇 달으로 이동하기 위해 문자열 '연도'또는 'Month'에 의해 선택 될 수 있습니다. 몇 년과 몇 달이 모두 같은 기간이 아니기 때문에 이들은 퍼지 단위입니다. 보다 정확한 유닛은 '2 주일', 14 일, '주'주 '7 일,'일 '의 가치'24 시간, '시간'의 '시간', '미세한'또는 'Min', 'Second'또는 'Second'또는 'Second'또는 'Second'또는 'SEC'는 1 초입니다. 이 장치의 'S'접미사가 수락되고 무시됩니다.

결과적으로 (강조 광산)

유닛의 퍼지는 상대 항목에 문제를 일으킬 수 있습니다. 예를 들어, 2003-06-31이 잘못된 날짜이기 때문에 '2003-07-31-1 개월'은 2003-07-01로 평가할 수 있습니다. 이전 달을 더 안정적으로 결정하려면 이번 달 15 일 이전의 달을 요청할 수 있습니다.. 예를 들어:

$ date -R
Thu, 31 Jul 2003 13:02:39 -0700
$ date --date='-1 month' +'Last month was %B?'
Last month was July?
$ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
Last month was June!

상기는 PHP로 표현 될 수있다

echo date('M', strtotime(date('Y-m-') . '15 -1 month'));

또한 아래의 커뮤니티를 참조하십시오 http://bugs.php.net/bug.php?id=22486

PHP 5.3에서 (참조 : https://bugs.php.net/bug.php?id=44073)) 할 수 있습니다 :

"first day of +1 month" 또는 "first day of next month" 또는 "last day of next month"

예시:

$date = '2015-12-31';

echo date("Y-m-d", strtotime($date ."first day of previous month"));

생산 : 2015-11-01 이것은 +30 일 기준으로 일을 계산하지 않습니다.

간단한 방법은 이렇게 쓰는 것입니다

echo 날짜 ( "m", strtotime ( "올해 +3 개월"));

또는

echo 날짜 ( "m", strtotime ( "이번 달 -3 개월"));

당신이 그것을 사용하는 것에 의존합니다 ..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top