2016-03-26 11 views
1

böyle DateTime API bir GÜN ve TIME (değil TARİH) gönderirseniz:DateTime API sadece gelecekte DAY çıktıları mı veriyor? PHP

$tz = new \DateTimeZone("UTC"); 
$now = new \DateTime("now", $tz); 
$then = \DateTime::createFromFormat('l g A', 'Thursday 8 PM', $tz); 

Ve şöyle yankılandı zaman, $, sonra şu anda MartCumartesi 26 geçerli:

echo $then->format('l jS, F'); 

döndürür:

Thursday 31st, March 

Ben MEVCUT biz Perşembe tarihini dönmek yaparım'ı Sadece geçenler ek:

Gelecek Perşembe?

+1

Sadece kullanabilirsiniz 'strtotime ('son Perşembe 08:00');' ve saat dilimini almak için bir DateTime nesneden zaman tedarik:

bu deneyin. –

+0

@JoelHinz * last * her zaman geçmişte bir tarih üretir. OP, mevcut haftanın gününü istiyor. Bugün, "son cumartesi" 2016-03-19 arası) – axiac

+0

Evet strtotime, burada görüntülenmeyen diğer işlevler için gereken şekilde çalışma değildi, bu yüzden DateTime kullanıyorum. – Grant

cevap

2

DateTime::__construct() ve strtotime() tamamlanmamış bir veya göreceli tarih belirtin ne demek istediğinizi tahmin etmek a lot of rules kullanır. Çoğu zaman doğru tahmin edersiniz ama bazı kurallar çok benzerdir ve nihai sonuç programcı tarafından beklenen sonuç değildir.

DateTime::createFromFormat() sınırlı, listeden tüm biçimleri anlayamıyor.

relative date format'u ayrıştırmayı deneyin. Sadece bir gün adı belirtildiğinde, bu haftanın belirli gün sonraki oluşumu olarak yorumlanır ( tablo documentation içinde Gün tabanlı Notasyonlar altında dayname girişini inceleyin.)

Sen alabilirsiniz Bu tarihte bu hafta kullanarak istediğiniz tarihi. DateTime::createFromFormat(), haftaya ait referansları içeren göreli tarihleri ​​anlamıyor, ancak DateTime::__construct() bunu yapıyor.

$then = new \DateTime('Thursday this week 8 PM', $tz); 
+0

Cevabımı daha iyi, oy hakkım var. – trincot

+0

Ahh DateTime'ın strtotime'a benzer değerleri kabul ettiği konusunda hiçbir fikrim yoktu. Bu harika! Çok teşekkür ederim;) – Grant

+1

Sadece benzer değil. ['DateTime :: __ construct()'] (http://php.net/manual/en/datetime.construct.php), ['date_create()'] (http://php.net/manual/en/ function.date-create.php) ve ['strtotime()'] (http://php.net/manual/en/function.strtotime.php) dahili olarak onlara sağlanan tarih dizelerini ayrıştırmak için aynı işlevi çağırır. – axiac

0

7 gün kaldırarak her zaman 'sub' yöntemini çağırabilir.

$tz = new \DateTimeZone("UTC"); 
$now = new \DateTime("now", $tz); 
$then = \DateTime::createFromFormat('l g A', 'Thursday 8 PM', $tz); 
$then->sub(new DateInterval('P7D')); 
echo $then->format('l jS, F'); 
+0

Her zaman 7 gün çıkarıldığında, tarih dizesinde belirtilen haftanın günü geçerli haftanın geleceği olduğunda, geçen haftadan tarihler gelir. Örneğin, önümüzdeki Pazartesi günü (2016-03-28) kodunuz bu haftanın Perşembe gününü (2016-03-24) iade edecek, ancak OP kodun çalıştığı haftanın gününü almak istiyor (Pazartesi 2016-03-31). – axiac

+0

Yanıt için teşekkürler. Bunu yeterince açık bir şekilde düşünmedim. –