문제
이것은 어제 코드를 변경하지 않고 잘 작동했습니다.
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 개월"));
당신이 그것을 사용하는 것에 의존합니다 ..