2016-06-13 7 views
1

私は、日付を取得する次のコードを持って、1ヶ月を引く。これは完全に機能します。月の最後の日付を取得するエラー

$date = '22-05-2016'; 
print(date("Y-m-d 23:59:59", strtotime($date.' -1 months'))); 
// outputs 2016-04-22 23:59:59 

強制的に月末にする必要がある場合があります。このため私はY-m-dの代わりにY-m-tを使用します。これは完全に機能します。解析された日付が実際にその月の最後の日であるとき

$date = '22-05-2016'; 
print(date("Y-m-t 23:59:59", strtotime($date.' -1 months'))); 
// outputs 2016-04-30 23:59:59 


問題が来ます。その後、次の月の終わりに反転します。

$date = '31-05-2016'; 
print(date("Y-m-t 23:59:59", strtotime($date.' -1 months'))); 

実際の出力2016年5月31日夜11時59分59秒(削除されていない1ヶ月)

所望の出力2016年4月30日夜11時59分59秒

EDIT:フィドル例http://ideone.com/0fqlor

+1

"月の数学" 数ヶ月は異なるサイズであるため、信頼性の高いことはありません:28,29,30,31。あなたが3月1日にいる場合は、1ヶ月を引いたものが何であるべきですか? 2月1日?それはうるう年に起こり、febは行進の前に来るから29日を引いた?マーチは31日かかるのでマイナス31日?もしあなたが3月31日に行けば、2月31日はない - それは3月3日に対応するだろう。 strtotimeはあなたの意図が何であるかわからないので、できる限りベストを尽くします。結果があいまいな場合はロジックを提供する必要があります。 –

+0

ご使用のPHPのバージョンは? PHP 7.0.3で問題を再現することはできません。 '$ date = '31 -05-2016 ';' 'print(日付(" Ymd 23:59:59 "、strtotime($ date。' -1 months ')));出力_2016-05-01 23 :59:59_ – GaijinJim

+0

「月末」と言った月の最後の日を特定することを意味しますか? – Ray

答えて

2

試してみてください。

$date = '31-05-2016'; 
print(date("Y-m-d 23:59:59", strtotime($date.' last day of last month'))); 

strtotime可能に掘る;)

はこちらをご覧ください:http://php.net/manual/en/datetime.formats.relative.php

最終注:-1 monthは、一度に30日戻って取得します。したがって、それは常に働くことはありません。何らかのPHPのものだと思います;)

+0

' $ date = '31 -01-2016''で奇妙な結果が得られました。 '2015-12-30 23:59:59'を出力し、' 31'を出力しません。私はなぜ、これは他の誰のためにも再現可能なのか分かりませんか? – Scott

+0

Uは確実に '-t'を取るこ​​とができますが、これを見ていきます。 – JustOnUnderMillions

+1

私はそれを更新しました。今すぐ動作します。 – JustOnUnderMillions

0

strtotimeはあなたの友人です。任意の「指定された」月の最後の日は、文字列last day of May 2015を使用して取得することができます。簡単な入力のために、選択した日付を最初に月式に変換します。

date_default_timezone_set('Europe/London'); 
$to = '31-05-2016'; 
$month = date("M Y", strtotime($to)); 
$strtotime_expression = "last day of " . $month; 
echo $strtotime_expression.": <br />"; 
print(date("Y-m-t 23:59:59", strtotime($strtotime_expression))); 

http://ideone.com/YvjVeP

関連する問題