【问题标题】:Creating an array with date information based on two dates基于两个日期创建包含日期信息的数组
【发布时间】:2012-04-26 00:03:02
【问题描述】:

我手动创建了以下数组(底部),我希望仅使用两个易于分解的字符串以编程方式创建它(explode())。

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

我已经对字符串进行了explode(),并找出了两个日期之间的月数

    $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),
);

【问题讨论】:

  • 24:00:00 不是实时的... :)
  • 我已经写到一半了,但我现在没有耐心弄清楚所有血淋淋的细节。基本上你要找的是strtotime 函数和很多date 函数。增加由strtotime 创建的时间戳,从开始日期循环到结束日期。使用date 的各种选项获取有关特定日期的所有信息,然后使用星期几、一个月中的几天、一个月中的某日等进行一些数学运算。
  • strtotime 创建一个 unix 时间戳,这看起来有点疯狂,这是你的意思吗?
  • 是的。为什么使用可以轻松递增和使用date 的时间戳会很疯狂?
  • 他认为你的意思是每毫秒循环一次。

标签: php arrays date loops for-loop


【解决方案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)

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

【讨论】:

  • 这太棒了,我感觉很糟糕,因为我看到你投入了这么多工作。我使用了您之前的一些代码,但放弃了 7 天的增量,主要是因为每月更新 - 您可以看到我的示例数组的口袋 5 是 4 月初。一周中的 DOW 日再次增强了它。我要看看这个新代码。感谢您进一步开发!
  • 我正在尝试使用您的代码。它有几个问题。第一个是我需要每周只包含一个月,$numOfWeeks var 不符合这个原则(我的数组长度是 9 你的是 8)。换句话说,我需要你的口袋4 在这个月被拆分。另一个基本问题是,并不是每周都会在周日结束。基本上,我试图从我的示例中获得口袋59。但我似乎只是把你的代码弄得一团糟。我还需要实现“周”数。
  • 我相信这一切都可以通过看起来像这样的weeks 数组来解决(更新后的帖子)。唉,我还没有成功。我认为一个月可能总是有 5 周,除非它从星期一开始?不,这不可能......如果我使用几周和一个双循环,我可以废弃$numOfWeeks。讨论这个问题对我有很大帮助,哈哈
  • 不是星期天结束吗?我看到你有一个 Sun Apr, 1, 2012 一周的一天,因为它是星期天,第一周是 4 天,因为你在星期天结束它。
  • 这是一个有效的观察。但这也是因为我希望一周从星期一开始。这是一些视觉表示。 imgur.com/a/qL7yB/all
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多