2016-03-31 13 views
3

Sadece PHP tarih fonksiyonunun tuhaf davrandığını fark ettim, birisi yanlış yaptığımı açıklayabilir mi?Geçen ayın son gününü almaya çalışırken garip PHP tarih davranışı

ardından kod görüntüler aynı sonuçları

<?php 
echo date('Y-m-t'); 
// Outputs last day of this month: 2016-03-31 
echo date('Y-m-t', strtotime("-1 month")); 
// For some reason outputs the same: 2016-03-31 
echo date('Y-m-t', strtotime("+1 month")); 
// Outputs 2016-05-31 

Sadece ben aptal olmak, ancak bunun neden böyle birisi bana açıklayabilir olabilir?

+3

Tüm bunlar, GNU sayfasında belgelenmiştir. [Burada] (https://www.gnu.org/software/shishi/manual/html_node/Relative-items-in-date-strings.html#Relative-items-in-date-strings): 'Ünitelerdeki fuzz göreli öğelerle sorunlara neden olabilir. Örneğin, -0 2003-07-31 -1 ay ’2003-07-01 tarihlerini değerlendirebilir, çünkü 2003-06-31 geçersiz bir tarihtir. ' –

cevap

11

senin bahsettiğin senin date('Y-m-t') çağrısında t kullanarak:

t - Eğer çözeceğini Eğer Y-m-d çalıştı Eğer belirli bir ay

içinde gün sayısı 2 olduğunu farklı tarihler:

<?php 

var_dump(date('Y-m-d')); 
var_dump(date('Y-m-d', strtotime('-1 month'))); 

st

<?php 

var_dump(date('Y-m-d')); 
var_dump(date('Y-m-d', strtotime('last day of last month'))); 

sonuçlanır:

halka (10) " 2016-03-31"
dize (10) " 2016-03-02"

Bu sorunu çözmek için size strtotime biçimini last day of last month kullanabilirsiniz

dize (10) "2016-03-31"
string (10) "2016-02-29"

+0

Cevabınız için teşekkürler, düşündüğüm gibi - sadece ben aptal olmak :) – di3sel

+1

Ve' \ DateTime() 'alt' 'DateInterval ('P1M')' ile kullanmak isterseniz ne yapabilirsiniz? Sonuç '-1 ay' veya 'geçen ay' ile aynı olacaktır. – walkingRed

+1

@walkingRed [Neden basitçe '' yerine '' yerine 'kullanamazsınız?] (Https://eval.in/545526) – h2ooooooo

6

date('Y-m-d', strtotime("-1 month"))'u deneyin, ne görüntüler? 2 Mart. Niye ya? 31 Şubat tarihi olmadığından ve PHP, devrilme matematiğine sahip olduğu için.

Temel sorun, "eksi bir ay" ın çok belirsiz ve kötü tanımlanmış olmasıdır. ,'un "31 Şubat" gibi tarihlere denk gelmesi durumunda ne olur? İyi ya da doğru bir cevap yok. Sonucu belirlemek için PHP'ye bırakmayın. Tanımlanmış bir sonuç beklerseniz, bir ayın ilk ayından ilk tarihinden bir ay kesin olarak düşülür.