Zend_Date: yaklaşan bir günün tarihini nasıl alabilirim?

1 Cevap php

Ben gelecekte en yakın Pazartesi tarihini almak istiyorum (yani geçmişte).

Bugün Salı (1 Aralık 2009) ise, Yani Pazartesi tarihini (7 Aralık 2009) almak istiyorum.

Ile bunu nasıl yapabilirim Zend_Date?

Solution:

Bugünü Salı ve biz önümüzdeki Pazartesi almak istedim diyelim. Pazartesi geleceğe 6 gündür. Yani, biz Pazartesi ait tarihi almak için 6 gün eklersiniz.

//like so:
$tuesday = Zend_Date::now();
$nextMonday = $tuesday->addDay(6);

Dinamik Bunu yapmak için, biz bugün haftanın hangi günü belirlemek gerekir:

$today = Zend_Date::now();
$dayNumber = $today->get(Zend_Date::WEEKDAY_DIGIT);
//dayNumber will now be equal to the numeric day of the week (0-6)
//example:
$weekdays = array(
    0 => 'sunday',
    1 => 'monday',
    2 => 'tuesday' //etc...
);

Biz gelecekte istenilen gün olsun eklemek gerekir kaç gün belirlemek için, aşağıdakileri yapın:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 );
#      $dayWanted = monday(1)
# $todayDayNumber = tuesday(2)
#               7 = number of days in a week (we don't want a negative number)
#       1 - 2 + 7 = 6 days into the future
$nextMonday = $today->addDay($daysToAdd);

En istediğimiz gün Çarşamba (yarın), geleceğe bir gün diyelim. Bizim daha önceki çözüm işe yaramaz:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 );
#      $dayWanted = wednesday(3)
# $todayDayNumber = tuesday(2)
#               7 = number of days in a week
#       3 - 2 + 7 = 8 days into the future (not 1)

Biz bir bölme işleminin kalanını almak için formül modulus operator (yüzde işareti) ekleyerek bu sorunu çözebilirsiniz.

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 ) % 7;
# (3 - 2 + 7) % 7
# $daysToAdd == 1 (remainder of 8 divided by 7)
$tomorrow = $today->addDay($daysToAdd);

Beklendiği gibi Şimdi bizim formül tek bir şey hariç ... çalışacaktır. Bugün Salı, ve ben bir sonraki Salı almak istiyorsanız, bizim formül yerine, bugünden itibaren bir hafta bugün dönecektir:

$daysToAdd = ( $dayWanted - $todayDayNumber + 7 ) % 7;
# (2 - 2 + 7) % 7 == 0
# 7 goes into 7 evenly with no remainder

Biz emin sıfıra eşit değildir olmak için bir kontrol eklemek zorunda olacak.

if ($daysToAdd == 0) {
    //give me the date a week from today, not today's date
    $daysToAdd = 7;
}

Final Solution:

public function outputDate()
{
    $monday = $this->getDateOfNext('monday');
    echo 'today: ' . Zend_Date::now()->toString(Zend_Date::RFC_850) . "<br>";
    echo "monday: " . $monday->toString(Zend_Date::RFC_850);
}

private function getDateOfNext($dayWanted)
{
    $weekdays = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday');
    if (!in_array($dayWanted, $weekdays)) {
        throw new Exception("'$dayWanted' not found in array of possible weekdays");
    }
    $weekdays = array_flip($weekdays);
    $date = Zend_Date::now();
    $today = $date->get(Zend_Date::WEEKDAY_DIGIT);
    $daysToAdd = ( $weekdays[$dayWanted] - $today + 7 ) % 7;
    if ($daysToAdd == 0) {
        //give me the date a week from today, not today's date
        $daysToAdd = 7;
    }
    $date->addDay($daysToAdd);
    return $date;
}

1 Cevap

Burada ortaya koydu mantık var:

$days_per_week = 7;
$weekdays = array_flip(array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'));

$day_wanted = 'mon';
$days_forward =
  ( $weekdays[$day_wanted] - $date->get(Zend_Date::WEEKDAY_DIGIT) + $days_per_week )
  % $days_per_week;

$date->addDay($days_forward);

İşte any $day_wanted için güzel çalışıyor.