Tarihten itibaren ayın son günü nasıl bulunur?


382

PHP'de ayın son gününü nasıl alabilirim?

Verilen:

$a_date = "2009-11-23"

2009-11-30 istiyorum; ve verildi

$a_date = "2009-12-23"

2009-12-31 istiyorum.

Yanıtlar:


805

tbelirli bir tarihin ayındaki gün sayısını döndürür ( için dokümanlara bakındate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));

99
Bu 2038 yılından sonra başarısız olacaktır. Bu nedenle strtotime yerine DateTime işlevi kullanılmalıdır. Aşağıdaki kod Yıl 2038 sorunu olmadan çalışır: $ d = new DateTime ('2009-11-23'); echo $ d-> formatı ('Ymt');
Mugunth

74
@Mugunth Gelecekte 24 yıllık tarihlerle çalışıyorsanız, 2038'den daha kısa sürede sorun yaşayabilirsiniz, ancak sunucular zaten sorunu düzeltmek için bize yaklaşık 292 milyar yıl verecek olan 64 bit mimariye geçiyor.
Hiçbiri

1
prosedürel olarak -> $ date1 = $ year .'- '. $ ay; $ d = date_create_from_format ('Y-m', $ tarih1); $ last_day = tarih_formatı ($ d, 't');
kayla

11
İle DateTimeböyle bir şey yapabilirsiniz:(new DateTime('2009-11-23'))->modify('last day of')
Victor

Carbon PHP kullanıyorsanız daysInMonth getter kullanabilirsiniz
astroanu

119

Strtotime () kullanan kod 2038 yılından sonra başarısız olacaktır. (Bu konudaki ilk cevapta verildiği gibi) Örneğin aşağıdakileri kullanmayı deneyin:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

Aşağıdaki gibi cevap verecektir: 1970-01-31

Bu nedenle strtotime yerine DateTime işlevi kullanılmalıdır. Aşağıdaki kod Yıl 2038 sorunu olmadan çalışacaktır:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

17
Ben 71 olacak ve o zamana kadar emekli olacak, bu yüzden benim için bir sorun değil! j / k Ama ciddi millet - bu uyarıyı dikkate alın!
Volomike

17
Bu, PHP'nin 32 bit sürümünü çalıştırdığınızı varsayar.
Hiçbiri

php docu php.net/manual/de/function.strtotime.php içinde neden belirtilmeyen strtotime hakkında bu endişe verici gerçek ?
Adam

1
@Adam Şimdi, kontrol ettiğinizden emin değilim. php.net/manual/de/…
Mave

1
2018 itibariyle strtotimekod bana bu sonucu veriyor: 2040-11-30
Jee

104

Bu biraz geç biliyorum ama DateTime sınıfını PHP 5.3+kullanarak bunu yapmak için daha zarif bir yolu olduğunu düşünüyorum :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

20
Bir satırda: $ date = new DateTime ('bu ayın son günü');
Harold

6
$ Date-> change ('bu ayın son günü') -> setTime (23,59,59); zamanın önemli olduğu yerlerde karşılaştırma için bu dateTime öğesini kullanmak istiyorsanız. (Bu size ayın son saniyesini verir)
omgitsdrobinoha

5
Bu çalışıyor:$date = new DateTime('last day of 2020-2');

4
@John yanılıyorsun. son gün, sistem tarihi değil, $ date nesnesi kullanılarak hesaplanır. Bunu ilk satırı değiştirerek deneyin:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir

5
Düşünmenizi ya da en azından sizden ne istediğimi deneseydiniz, bu ayın DateTime nesnesindeki ayın sistem tarihi değil değeri anlamına geldiğini görürdünüz . Eğer php kodunu yazamaz
Hannoun Yassir


24

Bu çalışmalı:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';

18

Sorun nedir - Benim için en şık olanı kullanmak DateTime

Acaba görmüyorum DateTime::createFromFormat, tek astarlı

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

2
Katılıyorum. Bu çözüm (DateTime sınıfı) eski datetime işlevlerini kullanmaktan çok daha iyidir.
schellingerht

17

Gelecek ayın ilk günü için bir tarih oluşturabilir ve ardından strtotime("-1 day", $firstOfNextMonth)


aynı yaklaşımı kullanan alternatif bir yöntem mktime'a gelecek ayın 0'ını vermektirmktime(0, 0, 0, $month+1, 0, $year);
George

Bana gelince, kullanımı strtotime()ve mktime()cesaretini kırmaktadır. kenarında tarih belirleme ve artık yıl kalalasyonları gibi bilinen hataların. Beri DateTimemevcut olup ileride herhangi sorunlardan kaçınmak için bu sınıfı kullanmalıdır. Gibi bu iki fonksiyon, benden önce birçok kez adı geçen strtotime()ve mktime()2038 sonrasında başarısız olur Ben downvoted neden en ...
Paul T. Rawkeen

@ PaulT.Rawkeen Bu cevap 4 yaşından büyük. İnternet'teki herhangi bir şeyde olduğu gibi, alaka ve kullanışlılığı ölçerken yaş bir faktör olmalıdır. Dahası, IMHO, teknoloji ile ilgili herhangi bir şey için yarılanma süresi özellikle kısadır.
nikc.org

@ nikc.org Özellikle tüm teknik çözümler için yaşam süresi ve sorun çözme yolları konusunda katılıyorum. Bu özel durumda, cevap nispeten iyi sayıda oy hakkına sahiptir ve muhtemelen birileri ( genç programcı ) bu cevabı kabul edilebilir bir çözüm olarak görecektir. kısa ve zarif :) ve muhtemelen beklenen sonuç elde edecek, ancak zaman geçtikçe, sorunların bu tür çözme bu şekilde zor hale gelir ve biz gereken zaman olası böyle gerçekler hakkında uyarmak. Saygılarımla .
Paul T. Rawkeen

16

PHP 5.3+ kullanıyorsanız bunu deneyin,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Geçen ayın son ayını bulmak için aşağıdaki gibi değiştirin,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

ve bunun gibi..


11

Çözümünüz burada ..

$lastday = date('t',strtotime('today'));

1
Bu veriyor 31için Septembersize bu doğru değil bildiği gibi hangi.
Iliyass Hamza

10

Ayın son gününü birkaç yolla bulabilirsiniz. Ama sadece bunu PHP strtotime () ve date () fonksiyonunu kullanarak yapabilirsiniz . Son kodunuzun şöyle görüneceğini hayal ediyorum:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Canlı Demo

Ancak PHP> = 5.2 kullanıyorsanız, yeni DateTime nesnesini kullanmanızı kesinlikle öneririm. Örneğin aşağıdaki gibi:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Canlı Demo

Ayrıca, aşağıdaki gibi kendi işlevinizi kullanarak bunu çözebilirsiniz:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);

İşleviniz için teşekkür ederiz, beklediğim gibi çalışıyor :)
Mankeomorakort

7

PHP DateTime için Carbon API uzantısını kullanırsanız , ayın son gününü aşağıdakilerle alabilirsiniz:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

Aslında, günü -1 ​​olarak ayarlarsanız, sonuncusu ancak bir tane alır. Bu nedenle, son günü almak için günü 0 olarak ayarlamanız gerekir. $date->day = 0;
Giovanne Afonso

teşekkürler @GiovanneAfonso doğru. Günü 0 olarak ayarladım ve cevabı test ettim.
eaykin

1
Carbon kullanıyorsanız, tek katmanlı bir yaklaşım kullanmaktır: Carbon :: Now () -> endOfMonth (). Ancak endOfMonth () bir değiştiricidir, bu nedenle bir Karbon tarihine sahip mevcut bir değişkeniniz varsa (veya tarih değiştirilir) "klon" kullanın.
Charlie Dalsass

4

Datetime ile de kullanabilirsiniz

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');

4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

2

Zend_Date'i kullanmak oldukça kolay:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));

2

Bir ayınız varsa ayın son tarihini alın,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
    }

$this->getLastDateOfMonth(01); //31

1

İşte tam bir işlev:

public function get_number_of_days_in_month($month, $year) {
    // Using first day of the month, it doesn't really matter
    $date = $year."-".$month."-1";
    return date("t", strtotime($date));
}

Bu, aşağıdakilerin çıktısını alır:

echo get_number_of_days_in_month(2,2014);

Çıktı: 28


1

Ayın son gününü almanın yolları var.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 

1

Geç kaldım ama belirtildiği gibi bunu yapmanın birkaç kolay yolu var:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Mktime () kullanmak zaman tüm yönleri üzerinde tam kontrol için benim gitmek olduğunu ... IE

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Günü 0 olarak ayarlamak ve ayınızı 1 yukarı taşımak bir önceki ayın son gününü verecektir. 0 ve negatif sayılar farklı tartışmalarda benzer etkiye sahiptir. PHP: mktime - Manual

Birkaçının söylediği gibi, strtotime gitmek için en sağlam yol değildir ve hiçbiri kolayca çok yönlü değilse çok azdır.


1

Aşağıdaki gibi cal_days_in_month ile strtotime kullanıyorum:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));


0

Tarih değil, mktime kullanmanın başka bir yolu ('t'):

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

Bu şekilde, 31,30 veya 29 ise


0

PHP DateTime için Carbon API uzantısı

Carbon::parse("2009-11-23")->lastOfMonth()->day;

veya

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

geri dönücek

30

-1
function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134


-2

Bu, ayın sonunu almak için çok daha zarif bir yol:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 

-3

tBelirli bir aydaki gün sayısını almak için tarih işlevinde " " kullanabilirsiniz .

Kod şöyle bir şey olacaktır:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

Kod kendi kendini açıklar. Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.