Tarih aralığı oluşturmak

5 Cevap php

Ben 20090101 bir başlangıç ​​tarihi ve 20091130 bir bitiş tarihi var ve ben bu gibi görüneceğini, hangi arasında inşa ve tüm ay dizi çalışıyorum:

<?php

/* ... */

$arrDates['Jan'] = 2009;
$arrDates['Feb'] = 2009;
$arrDates['Mar'] = 2009;

/* ... */

?>

Bunu nasıl yapabilirim?

5 Cevap

Ben tam olarak dizi yapısını anlamıyorum.

Ama belki bu yardımcı olur: PHP 5.3 kullanırken verilen aralıktaki tüm ay ile bir yineleyici almak için aşağıdaki gibi bir kod kullanabilirsiniz:

<?php
$db = new DateTime( '2009-01-01 00:00:00' );
$de = new DateTime( '2009-11-30 23:59:59' );
$di = DateInterval::createFromDateString( 'first day of next month' );

foreach ( $di as $dt )
{
    echo $dt->format( "Y-m\n" );
}
?>

Aşağıdaki kod parçasında böyle bir dizi oluşturur:

$startDate = '20090101';
$endDate = '20091130';
$arrDates = array();

$cur = strtotime($startDate);
$end = strtotime($endDate);
while ($cur < $end) {
	$arrDates[date('M', $cur)] = date('Y', $cur);
	$cur = mktime(0, 0, 0, date('m', $cur) + 1, 1, date('Y', $cur));
}

// If you want to add the 'end' month too...
$arrDates[date('M', $end)] = date('Y', $end);

Ancak, Pamela yorumladı gibi, size bir yıl daha büyük bir zaman aralığı işlemek istiyorum nasıl belirsiz, unutmayın. Yukarıdaki kod sadece size sağlamak aralığında geçen yıl kullanacaksınız.

Bu kod PHP hemen hemen herhangi bir sürümü (PHP 4 +) ile birlikte çalışacaktır. Eğer daha zarif bir çözüm istiyor ve PHP 5.2 + kullanıyorsanız, ben GZipp tarafından sunulan çözüm öneriyoruz.

Ben travelagency için inşa edilmiş bir web sitesi için benzer bir durum vardı. Sen damgaları, diziler ve döngü gerekir. PHP sağlar tarih fonksiyonuna bir göz atın. Size tarihleri ​​ile oynamak için bazı ilginç seçenekler sunar. Örneğin hayır. Belirtilen ayın gün.

Siz "arasında ay" demek, ama örnek başlangıç ​​ayı kapsayan beri, ben "arasındaki ay artı başlangıç ​​ve bitiş ay" demek varsayıyorum.

$dt_start = new DateTime('20090101');
$dt_end   = new DateTime('20091130');
$arrDates[] = $dt_start->format('M');
while ($dt_start->modify('first day of next month') <= $dt_end) {
    $arrDates[] = $dt_start->format('M');  // Or whatever you want to do with it.
}

(Bu aslında biraz manuel okuma PHP 5.2 için uyarlamak için uygulanan Johannes 'çözümdür.)

Kıvrık ama biraz ... çalışır:

function buildDateRange($strStartDate, $strEndDate) 
{					

	$strStartM = date('M', $strStartDate);
	$strStartY = date('Y', $strStartDate);

	$strEndM = date('M', $strEndDate);
	$strEndY = date('Y', $strEndDate);

	$intCurMN = date('m', $strStartDate);		

	$ii = 0;
	$blnFinished = FALSE;

	while(!$blnFinished) 
	{

		$strCurM  = date('M', mktime(0, 0, 0, $intCurMN , "01", $strStartY));					
		$strCurY  = date('Y' ,mktime(0, 0, 0, $intCurMN , "01", $strStartY));										

		$arrSearchDates [$strCurM] = $strCurY;

		$intCurMN = date('m', mktime(0, 0, 0, $intCurMN+1 , "01", $strStartY));					


		if($strEndM == $strCurM && $strEndY == $strCurY) 
		{
			$blnFinished = TRUE;	
		}
	}

	Return ($arrSearchDates);

}