2012-04-26 65 views
0

我手动创建了以下数组(底部),我希望仅使用两个可轻松爆炸(explode())的字符串以编程方式创建它。使用基于两个日期的日期信息创建一个数组

$min_date = '2012-03-01 00:00:00'; 
$max_date = '2012-04-25 00:00:00'; 

我已经爆炸()的字符串,以及发现多少个月是两个日期

$min_date = explode('-',$min_date); 
    $min_date['year'] = intval($min_date[0]); 
    $min_date['month'] = intval($min_date[1]); 
    $min_date['day'] = intval($min_date[2]); 

    $max_date = explode('-',$max_date); 
    $max_date['year'] = intval($max_date[0]); 
    $max_date['month'] = intval($max_date[1]); 
    $max_date['day'] = intval($max_date[2]); 

$months_between = ($max_date['month'] - $min_date['month']) + 12 * ($max_date['year'] - $min_date['year']); 

返回1个

cal_days_in_month()功能似乎太有用之间,我只是不知道如何...

$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year) 

这里是我手动创建的数组!

$periods = array(
    '0' => array(
    'month'=>'march', 
    'week'=>'1', 
    'days'=>'4', 
    'readable'=>' Thurs Mar, 01, 2012 - Sun Mar, 04, 2012', 
    'created_at_min'=>'2012-03-01 00:00:00', 
    'created_at_max'=>'2012-03-04 24:00:00' 
), 
    '1' => array(
    'month'=>'march', 
    'week'=>'2', 
    'days'=>'7', 
    'readable'=>' Mon Mar, 05, 2012 - Sun Mar, 11, 2012', 
    'created_at_min'=>'2012-03-05 00:00:00', 
    'created_at_max'=>'2012-03-11 24:00:00' 
), 
    '2' => array(
    'month'=>'march', 
    'week'=>'3', 
    'days'=>'7', 
    'readable'=>' Mon Mar, 12, 2012 - Sun Mar, 18, 2012', 
    'created_at_min'=>'2012-03-12 00:00:00', 
    'created_at_max'=>'2012-03-18 24:00:00' 
), 
    '3' => array(
    'month'=>'march', 
    'week'=>'4', 
    'days'=>'7', 
    'readable'=>' Mon Mar, 19, 2012 - Sun Mar, 25, 2012', 
    'created_at_min'=>'2012-03-19 00:00:00', 
    'created_at_max'=>'2012-03-25 24:00:00' 
), 
    '4' => array(
    'month'=>'march', 
    'week'=>'5', 
    'days'=>'6', 
    'readable'=>' Mon Mar, 26, 2012 - Sun Mar, 31, 2012', 
    'created_at_min'=>'2012-03-26 00:00:00', 
    'created_at_max'=>'2012-03-31 24:00:00' 
), 
    '5' => array(
    'month'=>'april', 
    'week'=>'1', 
    'days'=>'1', 
    'readable'=>' Sun Apr, 1, 2012', 
    'created_at_min'=>'2012-04-01 00:00:00', 
    'created_at_max'=>'2012-04-01 24:00:00' 
), 
    '6' => array(
    'month'=>'april', 
    'week'=>'2', 
    'days'=>'7', 
    'readable'=>' Mon Apr, 2, 2012 - Sun Apr, 8, 2012', 
    'created_at_min'=>'2012-04-01 00:00:00', 
    'created_at_max'=>'2012-04-08 24:00:00' 
), 
    '7' => array(
    'month'=>'april', 
    'week'=>'3', 
    'days'=>'7', 
    'readable'=>' Mon Apr, 9, 2012 - Sun Apr, 15, 2012', 
    'created_at_min'=>'2012-04-09 00:00:00', 
    'created_at_max'=>'2012-04-15 24:00:00' 
), 
    '8' => array(
    'month'=>'april', 
    'week'=>'4', 
    'days'=>'7', 
    'readable'=>' Mon Apr, 16, 2012 - Sun Apr, 22, 2012', 
    'created_at_min'=>'2012-04-16 00:00:00', 
    'created_at_max'=>'2012-04-22 24:00:00' 
), 
    '9' => array(
    'month'=>'april', 
    'week'=>'5', 
    'days'=>'3', 
    'readable'=>' Mon Apr, 23, 2012 - Wed Apr, 25, 2012', 
    'created_at_min'=>'2012-04-16 00:00:00', 
    'created_at_max'=>'2012-04-25 00:00:00' // note last day timestamp needs to be 00:00:00 
), 
); 

在我深入探讨之前,PHP提供的任何东西都可以提供极大的帮助吗?

$weeks = array(
    'may' = array(1,2,3,4,5), 
    'april' = array(1,2,3,4,5), 
); 
+0

'24:00:00'不是真正的时间... :) – deceze 2012-04-26 00:07:26

+0

我写了一个答案的一半,但我没有耐心弄清楚所有血淋淋的细节。基本上你要找的是['strtotime'](http://php.net/strtotime)函数和很多['date'](http://php.net/date)函数。增加'strtotime'创建的时间戳,从开始日期到结束日期循环。使用'date'的各种选项获取关于某个特定日期的所有信息,然后使用星期几,日,月,日等等做一些数学计算。 – deceze 2012-04-26 00:22:15

+0

'strtotime'创建一个unix时间戳这似乎是一个坚果循环,这是你的意思? – ThomasReggi 2012-04-26 00:34:58

回答

1
$min_date = new DateTime('2012-03-01 00:00:00'); 
$max_date = new DateTime('2012-04-25 00:00:00'); 
$numOfWeeks = ceil($min_date->diff($max_date)->days/7.0); 

$baseDate = $min_date->getTimestamp(); 
$startOfWeek = 'Mon'; 
for ($i = 0; $i <= $numOfWeeks + 1; $i++) 
{ 
    $weekRangeStart = date('D M, d, Y', $baseDate); 
    if (date('M', strtotime("Next Sunday", $baseDate)) == date('M', $baseDate)) 
    { 
     $weekRangeEnd = date('D M, d, Y', strtotime("Next Sunday", $baseDate)); 
     $nextDateObject = new DateTime(date('r', strtotime('Next Monday', $baseDate))); 
    } 
    else 
    { 
     $weekRangeEnd = date('D M, d, Y', strtotime("last day of this month", $baseDate)); 
     $nextDateObject = new DateTime(date('r', strtotime("last day of this month", $baseDate))); 
    } 

    $baseDateObject = new DateTime(date('r', $baseDate)); 

    $daysInWeek = $baseDateObject->diff($nextDateObject)->days; 

    $periods[] = array('month' => date('F', $baseDate), 'days' => $daysInWeek, 
       'readable' => $weekRangeStart . ' - ' . $weekRangeEnd); 

    if (date('D', $baseDate) != $startOfWeek) 
     $baseDate = strtotime("Next Monday", $baseDate); 
    else 
     $baseDate = strtotime("+1 week", $baseDate); 
} 

var_dump($periods); 

做这样的事情。你会得到一个像这样的数组:

array 
    0 => 
    array 
     'month' => string 'March' (length=5) 
     'days' => int 4 
     'readable' => string 'Thu Mar, 01, 2012 - Sun Mar, 04, 2012' (length=37) 
    1 => 
    array 
     'month' => string 'March' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Mar, 05, 2012 - Sun Mar, 11, 2012' (length=37) 
    2 => 
    array 
     'month' => string 'March' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Mar, 12, 2012 - Sun Mar, 18, 2012' (length=37) 
    3 => 
    array 
     'month' => string 'March' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Mar, 19, 2012 - Sun Mar, 25, 2012' (length=37) 
    4 => 
    array 
     'month' => string 'March' (length=5) 
     'days' => int 5 
     'readable' => string 'Mon Mar, 26, 2012 - Sat Mar, 31, 2012' (length=37) 
    5 => 
    array 
     'month' => string 'April' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Apr, 02, 2012 - Sun Apr, 08, 2012' (length=37) 
    6 => 
    array 
     'month' => string 'April' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Apr, 09, 2012 - Sun Apr, 15, 2012' (length=37) 
    7 => 
    array 
     'month' => string 'April' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Apr, 16, 2012 - Sun Apr, 22, 2012' (length=37) 
    8 => 
    array 
     'month' => string 'April' (length=5) 
     'days' => int 7 
     'readable' => string 'Mon Apr, 23, 2012 - Sun Apr, 29, 2012' (length=37) 
    9 => 
    array 
     'month' => string 'April' (length=5) 
     'days' => int 0 
     'readable' => string 'Mon Apr, 30, 2012 - Mon Apr, 30, 2012' (length=37) 

编辑:代码更新,使周不会跨越几个月。

+0

这真是太棒了,我感觉很糟糕,因为我可以看到你把很多的工作放在里面。我使用了一些早期的代码,但是放弃了7天的增量,主要是因为每月更新的问题 - 你可以看到我的示例数组中的口袋'5'是4月初。它再次增加了本周的DOW日。我要看看这个新代码。感谢您进一步发展! – ThomasReggi 2012-04-26 01:36:55

+0

那它工作? – Jack 2012-04-26 02:27:26

+0

我正在尝试使用您的代码。这有几个问题。首先是我需要每个星期只包含一个月,'$ numOfWeeks' var随着这个原则而变短(我的数组长度是'9',你的是'8')。换句话说,我需要你的口袋'4'在月份拆分。另一个基本问题是,并不是每个星期都会在星期天结束。基本上我试图从我的例子中得到'5'和'9'的口袋。但我似乎正在弄乱你的代码。我也需要实施“周”号码。 – ThomasReggi 2012-04-26 02:44:58