PHP - date () azaltma bug?

4 Cevap php

Ben bir tarihte kullanılmak üzere benim başlangıç ​​tarihi baz olarak bir unix zaman damgası kullanıyorum sorgu değişiyordu. 1228089600 (1 Aralık 2008 00:00:00): başlangıç ​​tarihi, bu örnek amacıyla i aşağıdaki zaman damgası kullanacak, sorun değildir.

Benim sorguda kullanılmak üzere kolayca böylece son saniye için herhangi bir ayın son günü bulmam gerekiyordu ..

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600)));

Bu yöntem, bir bütün ay ben tarih I sonucu bekliyordum sonra uzakta 1 saniye alıyor (1 Ocak 2009 00:00:00) ekleyerek, başlangıç ​​tarihini alarak .. Aralık dışında her ay benim için para cezası çalışıyor (31 Aralık 2008 23:59:59) gerekmektedir. Ancak yıl ilave ay için doğru hesaplanır ediliyor, ancak çıkarma için döndürülen tarih 31 Aralık 2009 23:59:59 değil ikinci olarak görünür.

Dediğim gibi ben bu sorunu keşfetti kadar, bu yöntem büyük çalıştı. Ama ben nedenini ya da basit bir çözüm anlamaya alamıyorum bir sorun ..

Herhangi bir yardım büyük beğeni topluyor.

4 Cevap

Bu olur, çünkü:

flag 'o' - ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. (added in PHP 5.1.0)

Yani sizin durumunuzda bu olur:

  1. Oluşturulan Tarihi 1 Ocak 2009 olduğunu
  2. Tarih 1 saniye ile indirildiği (yani 31 Aralık 2008 olsun) olduğunu
  3. Ancak yukarıda açıklama gider gibi - hafta 2009 yani 2009 yılına ait yerine 2008 döndürülür

(Yıl demektir ait: Haftanın Daha gün 2008 yılına göre 2009 yılında - Yukarıdaki durumda: 3 gün 2008 (Pazartesi, Salı, evlenmek vardır - 29, 30, 31) ve 4 (Per, Cum 2009 bulunmaktadır , oturdu, güneş - 1., 2., 3., 4.))

Bu gerçekten mktime() 12'den daha büyük bir "ay" değerini nasıl işleyeceğini bir hata ile görünmektedir.

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 2, 1, 2008));
2008-01-31 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 3, 1, 2008));
2008-02-28 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 1, 1, 2008));
2007-12-31 23:59:59

php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2008));
2009-12-31 23:59:59
php > echo date('o-m-d G:i:s',mktime(0, 0, -1, 13, 1, 2007));
2008-12-31 23:59:59

Yapabileceğiniz en iyi şey şu anda sonuç 13 ise sadece date('m', ...)+1 kendiniz ve özel durum hesaplama çıkışını kontrol etmek muhtemelen.

Ancak ben de GA API ile kullanıldığında aynı aşamada inşa başka bir tarih aralığı vardı, ay Ocak ise yıl azaltmak için bazı istisnalar eklemek yaptı. Bu tarih aralığı benzer olmasına rağmen yöntemle ince olduğunu görmek için sürpriz oldu. Fark olmak ..

Sorunlu:

date('o-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("o",1228089600)));

İnce:

date('Y-m-d G:i:s',mktime(0, 0, -1, date("m",1228089600)+1, 1, date("Y",1228089600)));

Yani geçiş yapma sorunu çözmüş görünüyor.

Umarım tüm bu kimse, birgün kullanım olabilir.

Bu deneyin:

$start = 1228089600;
$number_of_days_in_month = date('t', $time);
$end = strtotime('+' . $number_of_days_in_month . ' days', $start) - 1;
// subtract one second to get 23:59:59 or don't to get 00:00:00.
// Also note that there can be a leap second.
// $end = $start + $number_of_days_in_month * 86400 - 1; would probably work as well.

echo date('o-m-d G:i:s', $end);