2010-07-28 48 views
8

Với những ngày sau:Nhận phạm vi ngày giữa hai ngày trừ ngày cuối tuần

6/30/2010 - 7/6/2010 

và một biến tĩnh:

$h = 7.5 

tôi cần phải tạo một mảng như:

Array ([2010-06-30] => 7.5 [2010-07-01] => 7.5 => [2010-07-02] => 7.5 => [2010-07-05] => 7.5 => [2010-07-06] => 7.5) 

Các ngày cuối tuần bị loại trừ.

Không, đó không phải là bài tập về nhà ... vì một lý do nào đó tôi không thể nghĩ ngay hôm nay.

+0

Liệt kê ngày, sử dụng 'getdate (iter_date) [" wday "]' để bỏ qua cuối tuần (wday: 0 hoặc 6). – pascal

Trả lời

23

Đối với PHP> = 5.3.0, hãy sử dụng lớp DatePeriod. Thật không may là hầu như không có tài liệu.

$start = new DateTime('6/30/2010'); 
$end = new DateTime('7/6/2010'); 
$oneday = new DateInterval("P1D"); 

$days = array(); 
$data = "7.5"; 

/* Iterate from $start up to $end+1 day, one day in each iteration. 
    We add one day to the $end date, because the DatePeriod only iterates up to, 
    not including, the end date. */ 
foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { 
    $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ 
    if($day_num < 6) { /* weekday */ 
     $days[$day->format("Y-m-d")] = $data; 
    } 
}  
print_r($days); 
+0

Khi tôi chạy điều này, tôi nhận được Mảng ([2010-06-30] => 7.5 [2010-07-01] => 7.5 [2010-07-02] => 7.5 [2010-07-05] => 7.5) Thiếu ngày cuối cùng, 7/6. Tôi có thiếu thứ gì đó đơn giản không? – Jason

+0

Có vẻ như thay đổi $ end = '7/6/2010'; đến $ end = date ('m/d/Y', strtotime ('+1 ngày', strtotime ('7/06/2010'))); Hãy cho tôi những gì tôi đang tìm kiếm. – Jason

+0

Có, DatePeriod xuất hiện dừng _before_ ngày kết thúc. Của tôi xấu, cố định. – gnud

3

Phương pháp đơn giản nhất:

$start = strtotime('6/30/2010'); 
$end = strtotime('7/6/2010'); 
$result = array(); 
while ($start <= $end) { 
    if (date('N', $start) <= 5) { 
     $current = date('m/d/Y', $start); 
     $result[$current] = 7.5; 
    } 
    $start += 86400; 
} 
print_r($result); 

UPDATE: Quên để bỏ qua cuối tuần. Điều này sẽ hoạt động ngay bây giờ.

+1

Xem ra để tiết kiệm ánh sáng ban ngày –

+0

Hmm .. Điểm tốt. – Stephen

+1

Câu trả lời hay, cho địa điểm không cần tiết kiệm ánh sáng ban ngày :) – Shiro

1

Đây là câu trả lời gnud nhưng là một hàm (cũng nói thêm một tùy chọn để loại trừ các ngày hiện tại từ tính):

(ví dụ dưới đây)

public function getNumberOfDays($startDate, $endDate, $hoursPerDay="7.5", $excludeToday=true) 
{ 
    // d/m/Y 
    $start = new DateTime($startDate); 
    $end = new DateTime($endDate); 
    $oneday = new DateInterval("P1D"); 

    $days = array(); 

    /* Iterate from $start up to $end+1 day, one day in each iteration. 
    We add one day to the $end date, because the DatePeriod only iterates up to, 
    not including, the end date. */ 
    foreach(new DatePeriod($start, $oneday, $end->add($oneday)) as $day) { 
     $day_num = $day->format("N"); /* 'N' number days 1 (mon) to 7 (sun) */ 
     if($day_num < 6) { /* weekday */ 
      $days[$day->format("Y-m-d")] = $hoursPerDay; 
     } 
    }  

    if ($excludeToday) 
     array_pop ($days); 

    return $days;  
} 

Và để sử dụng nó:

$date1 = "2012-01-12"; 
$date2 = date('Y-m-d'); //today's date 

$daysArray = getNumberOfDays($date1, $date2); 

echo 'hours: ' . array_sum($daysArray); 
echo 'days: ' . count($daysArray); 
+0

hello @jarrod, tôi muốn vài phút toooo. – User1988

0

Đây là phương pháp tiếp cận OOP, chỉ trong trường hợp. Nó trả về một mảng với tất cả các ngày, ngoại trừ những ngày cuối tuần.

class Date{ 
     public function getIntervalBetweenTwoDates($startDate, $endDate){ 
      $period = new DatePeriod(
       new DateTime($startDate), 
       new DateInterval('P1D'), 
       new DateTime($endDate) 
      ); 
      $all_days = array();$i = 0; 
      foreach($period as $date) { 
       if ($this->isWeekend($date->format('Y-m-d'))){ 
        $all_days[$i] = $date->format('Y-m-d'); 
        $i++; 
       } 
      } 
      return $all_days; 
     } 
     public function isWeekend($date) { 
      $weekDay = date('w', strtotime($date)); 
      if (($weekDay == 0 || $weekDay == 6)){ 
       return false; 
      }else{ 
       return true; 
      } 
     } 
    } 
    $d = new Date(); 
    var_dump($d->getIntervalBetweenTwoDates('2015-08-01','2015-08-08')); 
+0

Nếu bạn có hai ngày giống nhau thì sao? var_dump ($ d-> getIntervalBetweenTwoDates ('2015-08-01', '2015-08-01')) – SuperManSL

Các vấn đề liên quan