Ben başlangıç tarihi ve bitiş tarihi vardır.
Ben onay kutusunu kullanıcı tıklaması üzerine vb bağımlı Pazar veya Pazartesi günü bulmak gerekir.
Nasıl / PHP hesaplamak bulabilirim?
Sen strtotime kullanan bir function () yinelemeli gün sayısını saymak için oluşturabilirsiniz. strtotime("next monday");
gayet güzel çalışıyor beri.
function daycount($day, $startdate, $counter)
{
if($startdate >= time())
{
return $counter;
}
else
{
return daycount($day, strtotime("next ".$day, $startdate), ++$counter);
}
}
echo daycount("monday", strtotime("01.01.2009"), 0);
Umarım bu aradığınız şey olduğunu :)
Hiçbir döngüler ve hiçbir recursivity
<?php
define('ONE_WEEK', 604800); // 7 * 24 * 60 * 60
function number_of_days($days, $start, $end) {
$w = array(date('w', $start), date('w', $end));
$x = floor(($end-$start)/ONE_WEEK);
$sum = 0;
for ($day = 0;$day < 7;++$day) {
if ($days & pow(2, $day)) {
$sum += $x + ($w[0] > $w[1]?$w[0] <= $day || $day <= $w[1] : $w[0] <= $day && $day <= $w[1]);
}
}
return $sum;
}
//$start = $end = time();
// 0x10 == pow(2, 4) == 1 << 4 // THURSDAY
// 0x20 == pow(2, 5) == 1 << 5 // FRIDAY
echo number_of_days(0x01, $start, $end); // SUNDAY
echo number_of_days(pow(2, 0), $start, $end); // SUNDAY
echo number_of_days(0x02, $start, $end); // MONDAY
echo number_of_days(pow(2, 1), $start, $end); // MONDAY
echo number_of_days(0x04, $start, $end); // TUESDAY
echo number_of_days(1 << 2, $start, $end); // TUESDAY
echo number_of_days(0x08, $start, $end); // WEDNESDAY
echo number_of_days(1 << 3, $start, $end); // WEDNESDAY
echo number_of_days(0x10, $start, $end); // THURSDAY
echo number_of_days(0x20, $start, $end); // FRIDAY
echo number_of_days(0x40, $start, $end); // SATURDAY
echo number_of_days(0x01 | 0x40, $start, $end); // WEEKENDS : SUNDAY | SATURDAY
echo number_of_days(0x3E, $start, $end); // WORKDAYS : MONDAY | TUESDAY | WEDNESDAY | THURSDAY | FRIDAY
?>
W35I3y tarafından cevabı neredeyse doğru idi, ama ben bu işlevini kullanarak hataları başlamıştı. Bu işlevi doğru pazartesi numarası veya verilen iki tarih arasındaki herhangi bir özel gün hesaplar:
/**
* Counts the number occurrences of a certain day of the week between a start and end date
* The $start and $end variables must be in UTC format or you will get the wrong number
* of days when crossing daylight savings time
* @param - $day - the day of the week such as "Monday", "Tuesday"...
* @param - $start - a UTC timestamp representing the start date
* @param - $end - a UTC timestamp representing the end date
* @return Number of occurences of $day between $start and $end
*/
function countDays($day, $start, $end)
{
//get the day of the week for start and end dates (0-6)
$w = array(date('w', $start), date('w', $end));
//get partial week day count
if ($w[0] < $w[1])
{
$partialWeekCount = ($day >= $w[0] && $day <= $w[1]);
}else if ($w[0] == $w[1])
{
$partialWeekCount = $w[0] == $day;
}else
{
$partialWeekCount = ($day >= $w[0] || $day <= $w[1]);
}
//first count the number of complete weeks, then add 1 if $day falls in a partial week.
return floor( ( $end-$start )/60/60/24/7) + $partialWeekCount;
}
Örnek:
$start = strtotime("tuesday UTC");
$end = strtotime("3 tuesday UTC");
echo date("m/d/Y", $start). " - ".date("m/d/Y", $end). " has ". countDays(0, $start, $end). " Sundays";
Outputs something like: 09/28/2010 - 10/19/2010 has 3 Sundays.
Başka bir gün boyunca bunu yapmak için nasıl bilmiyorum only.But ben Pazar için answer.Its çalışma var
// Define a constant of 1 day in seconds
define(ONE_DAY, 86400); date_default_timezone_set('America/New_York');
// Accepts two timestamps, start and end
// Returns an array of timestamps that fall on a sunday
function sundays_in_range($start, $end) {
echo date('N', $start);
echo "<br/>";
$days_until_sunday = date('w', $start) > 0 ? 7 - date('w', $start) : 0;
$date = $start + (ONE_DAY * $days_until_sunday);
$sundays = array();
while ($date <= $end) {
array_push($sundays, $date);
$date += (7 * ONE_DAY);
}
return $sundays;
}
// Calculate some example dates. Today, and 30 days from now
$start = time($start);
$end = time($end) + (30 * ONE_DAY);
echo ONE_DAY;
echo "<br/>";
$count=0;
// Loop and output Y-m-d
foreach (sundays_in_range($start, $end) as $sunday)
{
print "<option>".date("Y-m-d", $sunday)."</option><br/>";
$count++;
}
echo $count;
>
function daycount($day, $startdate, $enddate, $counter) {
if($startdate >= $enddate) {
return $counter-1; // A hack to make this function return the correct number of days.
} else {
return $this->daycount($day, strtotime("next ".$day, $startdate), $enddate, ++$counter);
}
}
Bu bir başlangıç ve bitiş noktası alır ve benim için çalışan ilk yanıt farklı bir versiyonudur. Bu sayfada verilen tüm örneklerde nedense cevabını artı ek bir gün geri dönmek gibiydi.
w35l3y cevabı iyi iş gibi görünüyor, bu yüzden o kadar oylanır. Yine de, ben takip etmek biraz daha kolay bir şey tercih ve daha az matematik ve döngü ile (emin değilim ama, performans açısından önemli). Ben tüm olası senaryolar kapsamında düşünüyorum ... Burada ben ile geldi ne:
function numDays($sday, $eday, $i, $cnt) {
if (($sday < $eday && $i >= $sday && $i <= $eday) || ($sday > $eday && ($i >= $sday || $i <= $eday))) {
// partial week (implied by $sday != $eday), so $i (day iteration) may have occurred one more time
// a) end day is ahead of start day; $i is within start/end of week range
// b) start day is ahead of end day (i.e., Tue start, Sun end); $i is either in back half of first week or front half of second week
$cnt++;
} elseif ($sday == $eday && $i == $sday) {
// start day and end day are the same, and $i is that day, i.e., Tue occurs twice from Tue-Tue (1 wk, so $wks = $cnt)
$cnt++;
}
return $cnt; // # of complete weeks + partial week, if applicable
}
Notlar: $ sday ve $ eday başlangıç ve kontrol edilecek aralığın sonuna tekabül gün numaraları ve $ i sayılan gün sayısı (Ben 0-6 döngü içinde var) olduğunu. Bunu her zaman hesaplamaya hiçbir nokta var gibi ben, fonksiyon dışında $ WKS taşındı.
$wks = floor(($endstamp - $startstamp)/7*24*60*60);
$numDays = numDays($sday, $eday, $i, $wks);
Herhangi bir aksi takdirde her zaman $ CNT ve $ hft'ya ile biraz kapalı olacak, emin karşılaştırarak konum başlangıç / bitiş damgaları aynı saat dilimi ayarını olduğundan emin olun. (Ayarlanmış bir gün / saat X için yılın bir düzeltilmemiş birinci sayarken ben koştum)
Bu soru sadece PHP'nin DateTime sınıfları, bu yüzden burada kullanan güncellenmiş cevap için yalvarıyor: -
/**
* @param String $dayName eg 'Mon', 'Tue' etc
* @param DateTime $start
* @param DateTime $end
* @return int
*/
function countDaysByName($dayName, \DateTime $start, \DateTime $end)
{
$count = 0;
$interval = new \DateInterval('P1D');
$period = new \DatePeriod($start, $interval, $end);
foreach($period as $day){
if($day->format('D') === ucfirst(substr($dayName, 0, 3))){
$count ++;
}
}
return $count;
}