0

在下面创建了制作时间以显示双周日期

<?php
  $date1 = "07/05/2013";
  $date2 = date('M j, Y', strtotime($date1 . " + 14 day"));
  $date3 = date('M j, Y', strtotime($date2 . " + 14 day"));
  $date4 = date('M j, Y', strtotime($date3 . " + 14 day"));
  $date5 = date('M j, Y', strtotime($date4 . " + 14 day"));
  $date6 = date('M j, Y', strtotime($date5 . " + 14 day"));
  $date7 = date('M j, Y', strtotime($date6 . " + 14 day"));
  $date8 = date('M j, Y', strtotime($date7 . " + 14 day"));
  $date9 = date('M j, Y', strtotime($date8 . " + 14 day"));
  $date10 = date('M j, Y', strtotime($date9 . " + 14 day"));
  $date11 = date('M j, Y', strtotime($date10 . " + 14 day"));
  $date12 = date('M j, Y', strtotime($date11 . " + 14 day"));
  $date13 = date('M j, Y', strtotime($date12 . " + 14 day"));
  $date14 = date('M j, Y', strtotime($date13 . " + 14 day"));
  $date15 = date('M j, Y', strtotime($date14 . " + 14 day"));
  $date16 = date('M j, Y', strtotime($date15 . " + 14 day"));
  $date17 = date('M j, Y', strtotime($date16 . " + 14 day"));
  $date18 = date('M j, Y', strtotime($date17 . " + 14 day"));
?>

我怎样才能让它按月分组?假设我想知道八月或十二月有多少日期。另外,如果我想知道到年底有多少个日期?伸出援助之手将不胜感激。

4

4 回答 4

1

尝试这个:

<?php
// initiate months
$month_arr = Array();
for ($i=1; $i<=12; $i++){
    // no. of dates
    $month_arr[$i] = 0;
}
$date_arr = Array();
$date_start = "07/05/2013";
$date_arr[] = date('M j, Y', strtotime($date_start));

for ($i=1; $i<=17; $i++){
    $date_temp = date('M j, Y', strtotime($date_arr[$i-1] . " + 14 day"));
    $month = date('n', strtotime($date_temp));

    $month_arr[$month] += 1;
    $date_arr[] = $date_temp;

  }

 foreach ($month_arr as $k => $v){
    echo "<BR>Month: " . $k . ", No. of dates: " . $v;
 }

// all dates
echo "<BR>All dates<BR>";
var_dump ($date_arr);
?>

您可以扩展此逻辑以按月对实际日期进行分组,而不是仅获取一个月中的日期计数。这是解决方案:

<?php
// initiate months
$month_arr = Array(
            'January' => Array('num_dates'=>0, 'dates'=>Array()) , 
            'February' => Array('num_dates'=>0, 'dates'=>Array()), 
            'March' => Array('num_dates'=>0, 'dates'=>Array()), 
            'April' => Array('num_dates'=>0, 'dates'=>Array()), 
            'May' => Array('num_dates'=>0, 'dates'=>Array()), 
            'June' => Array('num_dates'=>0, 'dates'=>Array()), 
            'July' => Array('num_dates'=>0, 'dates'=>Array()), 
            'August' => Array('num_dates'=>0, 'dates'=>Array()), 
            'September' => Array('num_dates'=>0, 'dates'=>Array()), 
            'October' => Array('num_dates'=>0, 'dates'=>Array()), 
            'November' => Array('num_dates'=>0, 'dates'=>Array()), 
            'December' => Array('num_dates'=>0, 'dates'=>Array())
        );
$date_arr = Array();

$date_start = "07/05/2013";
$date_arr[] = date('M j, Y', strtotime($date_start));

for ($i=1; $i<=17; $i++){
    $date_temp = date('M j, Y', strtotime($date_arr[$i-1] . " + 14 day"));
    $month = date('F', strtotime($date_temp));

    $month_arr[$month]['dates'][] = $date_temp;
    $month_arr[$month]['num_dates'] += 1;
    $date_arr[] = $date_temp;
}

foreach ($month_arr as $k => $v){
    if (!empty($v)){
        if ($v['num_dates'] != 0){
            echo "<BR><BR>Month: " . $k;
            echo "<BR>No. of dates: " . $v['num_dates'];
            foreach ($v['dates'] as $k1=>$v1){
                echo "<BR>" . $v1;
            }
        }
     }
}
?>

此时, $month_arr 应该拥有您需要的一切。

于 2013-07-18T19:03:50.440 回答
1

我不确定您对按月分组的确切含义,但这将使用数组来声明所有日期,您可以更改 $limit 变量以增加或减少日期数量。更改 $dates 以调整您的原始日期 $left 是数组中剩余的天数(它在第一天触发后触发,可以更改为在最后一天触发) $amount 是八月的日期

<?php
$limit = 17;
$dates = array("07-05-2013");
for ($i=1; $i<=$limit; $i++){
    $dates[$i]=date('d-m-Y', strtotime($dates[$i-1] . "+ 14 days"));
}
foreach (array_keys($dates) as $key){ 
    $value = date('m', strtotime($dates[$key])); 
    if ($value == "08"){
        $amount = $amount + 1;  
    }
    if ($amount == 1){
        $left = $limit-$key;
    }
}
print_r ($dates);
echo "<br>";
echo $amount . "<br>" . $left;
?>
于 2013-07-18T20:05:12.983 回答
0

只需添加一个 if 语句并在所有 12 个月内递增……如果月份相同

 $n=1;
 $month=array();//dumpyour dates in  an array
 $date=array()

 while($k<30){
 if  (date('n', strtotime($date[$k]))==date('n', strtotime($date[$k-1])){
 echo $date[$k++];
 $m = date('n', strtotime($date[$k]));
 $month[$m]=++$n;
 }
 else{
 .....

 }
 }
于 2013-07-18T18:51:24.793 回答
0

当我不断重复 SO 时,PHP 的DateTime 类使大多数日期时间操作变得微不足道。

您的问题不是 100% 清楚,但从您的评论看来,您需要一组时间戳,按月分隔 14 天。我不知道您是否认为月份可能会跨越年份,但我在回答中考虑到了这一点。

下面的代码应该做你想做的事: -

$start = \DateTime::createFromFormat('d/m/Y', '07/05/2013');
$interval = new \DateInterval('P14D');
$periods = new \DatePeriod($start, $interval, 26);

$dates = array();

foreach($periods as $day){
    /** @var \DateTime $day */
    $dates[$day->format('Y')][$day->format('M')][] = $day->getTimestamp();
}

var_dump($dates);

输出:-

array (size=2)
  2013 => 
    array (size=8)
      'May' => 
        array (size=2)
          0 => int 1367936286
          1 => int 1369145886
      'Jun' => 
        array (size=2)
          0 => int 1370355486
          1 => int 1371565086
      'Jul' => 
        array (size=3)
          0 => int 1372774686
          1 => int 1373984286
          2 => int 1375193886
      'Aug' => 
        array (size=2)
          0 => int 1376403486
          1 => int 1377613086
      'Sep' => 
        array (size=2)
          0 => int 1378822686
          1 => int 1380032286
      'Oct' => 
        array (size=2)
          0 => int 1381241886
          1 => int 1382451486
      'Nov' => 
        array (size=2)
          0 => int 1383664686
          1 => int 1384874286
      'Dec' => 
        array (size=3)
          0 => int 1386083886
          1 => int 1387293486
          2 => int 1388503086
  2014 => 
    array (size=5)
      'Jan' => 
        array (size=2)
          0 => int 1389712686
          1 => int 1390922286
      'Feb' => 
        array (size=2)
          0 => int 1392131886
          1 => int 1393341486
      'Mar' => 
        array (size=2)
          0 => int 1394551086
          1 => int 1395760686
      'Apr' => 
        array (size=2)
          0 => int 1396966686
          1 => int 1398176286
      'May' => 
        array (size=1)
          0 => int 1399385886

我建议您使用 DateTime 对象数组而不是时间戳数组,然后您可以根据需要操作每个对象。在这种情况下,代码将如下所示:-

$start = \DateTime::createFromFormat('d/m/Y', '07/05/2013');
$interval = new \DateInterval('P14D');
$periods = new \DatePeriod($start, $interval, 26);

$dates = array();

foreach($periods as $day){
    /** @var \DateTime $day */
    $dates[$day->format('Y')][$day->format('M')][] = $day;
}
于 2013-07-19T14:26:51.557 回答