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;
}