PHP strtotime-1ay-2month

5 Cevap php

Bu kod herhangi bir değişiklik ile dün gayet iyi çalışıyordu.

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

Dün üreten çıktı sendin Nisan, Mayıs, Haziran, Temmuz-yani beklediğiniz gibi

Bugün Mayıs Mayıs Temmuz Temmuz yankıları

Herhangi bir fikir?

Şimdiden teşekkürler.

5 Cevap

Bu hata ile ilgili olabilir #44073

Böyle bir şey deneyebilirsiniz:

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";

(Solution found in the comments section of strtotime ; direct link)

Ve çıkış:

Apr
May
Jun
Jul

Kind of "cheating" with the date format and month's name and all that...

Yerine bu deneyin strtotime:

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

Fikir, cari ay sayısını (date("n")), sen (burada -3) istiyorum ondan ay sayısını çıkartmak almak ona 12 ekleyebilir ve ardından modülosunu 12 elde etmektir.

Gorden doğru sorunu tespit edilmiştir, ama yararlı ve teknik değil başka bir çözüm vermek istedim. Sadece "ilk günü" ya da strtotime içinde "son günü" kullanın. Ex, bu aşağıdaki örnekler ayın 31'inde sorunu aşmak:

// 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');

Bu davranış bilinen ve beklenen. Bunun nedeni, bir month sabit uzunlukta bir göreceli tarih olmasıdır. Dan http://www.gnu.org/software/tar/manual/html_node/Relative-items-in-date-strings.html#SEC120

Zaman yerinden birim bütün yıl veya ay hareket ettirilmesi için dizesi 'yıl' veya 'ayın tarafından seçilebilmektedir. Yıl ve ay eşit süreli değil tüm olarak bu, bulanık birimleridir. Daha hassas birimleri 14 gün, 'hafta' değerinde 7 gün, 'gün' değerinde 24 saat, 'saat' değerinde 60 dakika, 'dakika' ya da 'min' 60 saniye değerinde ve 'ikinci' değerinde ya da 'iki hafta' vardır 'SN' değerinde bir saniye. Bu birimlerin bir 's' eki kabul ve göz ardı edilir.

Sonuç (vurgu benim)

Birimlerde zabıta göreli öğeleri ile sorunlara neden olabilir. 2003/06/31 geçersiz bir tarih olduğundan Örneğin, '2003-07-31 -1 ay ', 2003-07-01 değerlendirmek olabilir. To determine the previous month more reliably, you can ask for the month before the 15th of the current month. Örneğin:

$ 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!

Yukarıdaki gibi PHP ifade edilebilir

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

Ayrıca aşağıda commments bakın http://bugs.php.net/bug.php?id=22486

basit bir şekilde bu gibi yazmak olabilir

echo date ("M", strtotime ("bu yıl +3 ay"));

veya

echo date ("M", strtotime ("Bu ay -3 ay"));

depends what your using it fveya..