2011-11-29 125 views
3

有没有一种方法可以获得每个月的PHP开始/结束日期给定一个月? 因此,举例来说,如果我把这个月(2011年11月),我需要返回如何获取给定月份中每周的日期间隔?

30 Oct -> 5 Nov 
6 Nov -> 12 Nov 
13 Nov -> 19 Nov 
20 Nov -> 26 Nov 
27 Nov -> 3 Dec 

LE:

这里是我的情况下,另外一个人需要它做。代码并不漂亮,但它工作,因为我需要它。

public function getMonthWeeks($month, $year) 
{ 
    $month = intval($month); 

    if ($month < 1) { 
     $month = 1; 
    } 

    if ($month > 12) { 
     $month = 12; 
    } 

    $tsfdOfMonth = mktime(0, 0, 0, $month, 1, $year); 
    $dayOfWeek = idate('w', $tsfdOfMonth); 

    $tIntervalStart = $tsfdOfMonth; 
    $tNextMonth  = idate('m', strtotime("+1 month", $tsfdOfMonth)); 

    if ($dayOfWeek > 0) { 
     $tStr = sprintf("-%d %s", 
      $dayOfWeek, 
      $dayOfWeek == 1 ? 'day' : 'days' 
     ); 
     $tIntervalStart = strtotime($tStr, $tsfdOfMonth); 
    } 

    $resultDates = array(); 

    $tsStart = $tIntervalStart; 
    $tsEnd = strtotime('+6 days', $tsStart); 

    while (true) { 
     $rObj = new stdClass; 
     $rObj->LinkStr = sprintf("%s %s - %s %s", 
      date('M', $tsStart), date('d', $tsStart), 
      date('M', $tsEnd), date('d', $tsEnd) 
     ); 
     $rObj->DateStart = date('Y-m-d', $tsStart); 
     $rObj->DateEnd = date('Y-m-d', $tsEnd); 

     $resultDates[] = $rObj; 

     if (idate('m', strtotime('+1 day', $tsEnd)) == $tNextMonth) { 
      break; 
     } 

     $tsStart = strtotime('+1 day', $tsEnd); 
     $tsEnd = strtotime('+6 days', $tsStart); 
    } 

    return $resultDates; 
} 
+1

已经有很多问题询问如何[获取一周的第一天](http://stackoverflow.com/search?q=first+day+of+week+php)。一旦你有这一天,这是[微不足道] [添加七天](http://stackoverflow.com/search?q=add+days+php)。请通过这些问题,并更新自己的问题,解释困难是什么。 – Gordon

回答

4

你将不得不编写一个函数:

算法:

  1. 获得第一个月的星期。
  2. 减去必要的天数达到星期日 - 你现在有月的第一个“星期日”(可能是上个月的星期日)的日期。
  3. 添加六天来确定当周的星期六。
  4. 添加一天来确定下周的星期日。
  5. 重复3和4,直到我们在当月不再

两个功能将是非常有益的:$saturdaytimestamp = strtotime("+6 days", $sundaytimestamp)$dayofweek = idate('w', $timestamp);

2

你应该使用这些功能 - cal_days_in_month,的strtotime,日期

$aMonthWeeks = get_month_week_day_ranges(2011, 11); 
print_r($aMonthWeeks); 

function get_month_week_day_ranges ($year, $month) { 
    $last_month_day_num = cal_days_in_month(CAL_GREGORIAN, $month, $year); 

    $first_month_day_timestamp = strtotime($year.'-'.$month.'-01'); 
    $last_month_daty_timestamp = strtotime($year.'-'.$month.'-'.$last_month_day_num); 

    $first_month_week = date('W', $first_month_day_timestamp); 
    $last_month_week = date('W', $last_month_daty_timestamp); 

    $aMonthWeeks = array(); 
    for($week = $first_month_week; $week <= $last_month_week; $week ++) { 
     echo sprintf('%dW%02d-1', $year, $week), "\n"; 
     array_push($aMonthWeeks, array( 
      date("d:m:Y", strtotime(sprintf('%dW%02d-1', $year, $week))), 
      date("d:m:Y", strtotime(sprintf('%dW%02d-7', $year, $week))), 
     )); 
    } 
    return $aMonthWeeks; 
} 

对于我的语言环境(一周的第一天是周一)的结果是

Array 
(
    [0] => Array 
     (
      [0] => 31:10:2011 
      [1] => 06:11:2011 
     ) 

    [1] => Array 
     (
      [0] => 07:11:2011 
      [1] => 13:11:2011 
     ) 

    [2] => Array 
     (
      [0] => 14:11:2011 
      [1] => 20:11:2011 
     ) 

    [3] => Array 
     (
      [0] => 21:11:2011 
      [1] => 27:11:2011 
     ) 

    [4] => Array 
     (
      [0] => 28:11:2011 
      [1] => 04:12:2011 
     ) 

) 
1

我不知道这样做的最佳方法是什么,但这可能会起作用:你问PHP每周的哪一天是本月的第一天,比如date('w', mktime(0, 0, 0, (int)date('m'), 1, (int)date('Y'));,然后你可以倒计时到一周的第一天,使用checkdate()函数确定上个月的最后一天,然后用简单的while()构建阵列,直到您到达结束的一周但未在下个月开始。

0

我刚上任的时候,为你的代码这一点,这将输出你想要什么:

<?php 

/* CONFIG */ 

$year = 2011; 

$month = 11; 

/* CODE */ 

$first_day = mktime(0, 0, 0, $month, 1, $year); 

$month_first_day = date('w', $first_day); 

if($month_first_day != 1) { 

    $offset = $month_first_day - 1; 

    $previous_month = ($month == 1 ? mktime(0, 0, 0, 12, 1, ($year - 1)) : mktime(0, 0, 0, ($month - 1), 1, $year)); 

    $previous_month_days = date('t', $previous_month); 

    $previous_month_saturday = $previous_month_days - $offset; 

    $previous_month_stamp = ($month == 1 ? mktime(0, 0, 0, 12, $previous_month_saturday, ($year - 1)) : mktime(0, 0, 0, ($month - 1), $previous_month_saturday, $year)); 

    $first_saturday = $previous_month_stamp; 

}else{ 

    $first_saturday = $first_day; 

} 

$loops = date('t', $first_day); 

$loops = round($loops/7); 

for($loop = 1; $loop < ($loops + 2); $loop++) { 

    echo date('j M', $first_saturday + ((7 * ($loop - 1)) * 24 * 60 * 60)) . ' -> ' . date('j M', $first_saturday + (((7 * $loop) - 1) * 24 * 60 * 60)) . '<br />'; 

} 

这可能不是实现这一目标的最有效途径。然而,它会得到你所要求的成就,并且它会给你一个关于如何完成这个任务的总体思路。

+1

我没有。我投了票。我想有些人不喜欢你给我的解决方案?而且他们会更喜欢只给我指针,所以我可以自己解决。我做了什么,我几乎让我的版本运行。无论如何谢谢您花时间回答我的问题。 – daniels

相关问题