2011-06-17 8 views
2

「3か月前」の日付を検索するスクリプトを作成しています。私は何もお見逃しなく確認することを考えていたように、私は比較のためにこれを使用しています:検索の日付を月間前にすると、現在の月が短くなると日付が失われますか?

$date = date("Y-m-d",mktime(0,0,0,date("m")-$months_ago,date("d"))); 

私は日付が不足している可能性がある実現しています。たとえば、私が11月30日に3ヶ月前の日付を検索すると、私は8/30になります。しかし、翌日は12/1で、3ヶ月前は9/1です。ですから、このスクリプトで私は8/31を逃しました。

おそらく、最良の方法は、月に代わりに日数(90日)を使用することです。これはこのようなもののベストプラクティスですか?

答えて

9

(より良い第二の溶液を)Goが直接strtotime('-3 month');と、あなたはまた、mktime関数の月のparamに-3のようなネガを与えることができ、それが魅力のように動作します。いいえ、それはスキップ日はありません - もし "今"が2011年6月17日であれば、2011年3月17日に相当するタイムスタンプを返します。

編集: まあ、実際には、日数が足りないことがあります(私はあなたの声明をチェックしていません)。私が言っていることは、グレゴリオ暦の月では一定の時間ではないことです - それは28,29,30、または31日である可能性があります。

有料の定期購入期間の月を計算したいとします。ユーザーが2011年2月15日に1か月間支払った場合、契約はいつ終了するのですか?私は2011-03-15を推測しますが、その2つの日の間にわずか28日間があります。2011-03-15にサブスクリプションを支払うと、彼は2011-04-15まで31日間完全になりますサブスクリプションが "1ヶ月"であることから私には、ちょうど1年を通して異なる日数が発生します。

「3か月前」を取得するのではなく、「3か月」を相対的に表す一定量の時間を取得したい場合は、中間月の長さを使用できます - 88.59日、または88日14時間10分。コードで表さそれは次のようになります。

strtotime('-88 days -14 hours -10 minutes');

+0

はい、この方法で8/31を得ることは不可能でしょうか? 11/30は8/30を返し、12/1は9/1を返します。だから、 "-3ヶ月"法を使うのに欠陥があるようです。何か不足していますか? – Thom

+0

私は自分の考え方をよりよく説明するために私の答えを編集しました。 – ddinchev

3
$when = strtotime('-3 months'); 
+0

私はそれは誤りだと思ったが、いや、 PHPは非常にスマートで、「月」と「月」の両方を理解しています。 \ m/ – Paul

0

あなただけの月/年必要と日数を計算する必要はしたくない場合は、次の

$m = 5; // how many months ago, for example 

$now = time(); 
$cm = date("m",$now); // current month 
$yr = date("Y",$now) - intval((12 + $m - $cm)/12); 
$month = (($cm + 11 - ($m % 12)) % 12) + 1; 

echo "$m months ago: $month yr: $yr\n"; 
関連する問題