13

これは昨日、コードを変更することなく正常に機能していました。

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());

昨日生成された出力は、予想どおりでした-つまり、4月、5月、6月、7月

今日はこだまする May May Jul Jul Jul

何か案は?

前もって感謝します。

4

6 に答える 6

15

バグ#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

日付の形式や月の名前などを使った一種の「ごまかし」...

于 2009-07-31T10:38:22.690 に答える
10

Gorden は問題を正しく特定しましたが、技術的ではなく役立つ別の解決策を提供したいと思いました。strtotime で「初日」または「最終日」を使用するだけです。たとえば、次の例では、月の 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');
于 2012-05-31T16:24:37.850 に答える
5

代わりにこれを試してくださいstrtotime

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

アイデアは、現在の月数 ( date("n")) を取得し、そこから必要な月数を引き (ここでは-3)、それに 12 を加算してから 12 を法として取得することです。

于 2009-07-31T10:40:42.407 に答える
4

これは既知の予想される動作です。これは、が固定長のない相対日付であるためです。http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120から

時間変位の単位は、文字列 'year' または 'month' で選択して、年単位または月単位で移動できます。年と月はすべて同じ期間ではないため、これらはあいまいな単位です。より正確な単位は、14 日を表す「fortnight」、7 日を表す「week」、24 時間を表す「day」、60 分を表す「hour」、60 秒を表す「minute」または「min」、および「second」または'sec' は 1 秒に相当します。これらの単位の「s」サフィックスは受け入れられ、無視されます。

その結果(強調鉱山)

単位のあいまいさは、相対アイテムで問題を引き起こす可能性があります。たとえば、2003-06-31 は無効な日付であるため、'2003-07-31 -1 month' は 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

于 2011-05-31T06:10:50.547 に答える
0

簡単な方法は、このように書くことです

echo date("M", strtotime("今年 +3 か月"));

また

echo date("M", strtotime("今月 -3 か月"));

何に使うかによります..

于 2012-03-18T16:28:22.747 に答える