【问题标题】:Get the number of days and determine which month from the between two dates获取天数并确定两个日期之间的哪个月
【发布时间】:2017-07-19 09:46:09
【问题描述】:

我知道这很疯狂,但我仍在寻求您的解决方案。

现在,我有两个日期:假设开始日期:2017-02-01 和结束日期:2017-04-01。

如果我比较结束日期​​和开始日期,我当然会得到 60 天(包括 2017-02-01 的一天)。

假设我不知道这两个日期之间的月份以及月份有多少天。呃……有没有办法确定日期和月份……清楚吗?

类似这样的:

  1. 2017-02-01 => 2017-02-28 = 28 天,这是二月
  2. 2017-03-01 => 2017-03-31 = 31 天,这是三月
  3. 2017-04-01 => 2017-04-01 = 1 天,这是四月

我只能在 PHP 中找到两个日期之间的天数,当然它比这个更容易。我认为这个已经涵盖了数组的概念,并且已经超出了我的 IQ XD。

我需要你的帮助,通过解决这个问题来证明自己,非常感谢!非常感谢。

更简单地说:我想找到的是——我不想找到两个日期之间的哪一天,我想找到这两个日期之间每个月的月份和天数。

P/S:我没有任何代码,因为我什至不知道如何开始编写代码。

【问题讨论】:

  • “我不知道是几月”,好吧,如果你有日期,你就知道月份了。
  • 4. 2017-05-01 => 2017-07-01 = 61 天,这是 5 月、6 月、7 月?
  • @JulienLachal 让我们说吧。
  • @mulquin 是这样的,并确定他们有多少(每个月)。
  • 顺便说一句,这只是 60 天。您还应该解释您想解决的问题。要获取日期,请从结束日期中减去 strt 日期。如果您只有没有月份的日子,则没有单一的解决方案,因为有几种组合会产生相同的结果。你最好解释一下你想要达到的目标。

标签: php arrays date logic


【解决方案1】:

您可以使用 date_diff 函数。 date_diff 函数计算两个日期之间的天数,所以你也可以加 2 来计算你的日期..

$date1=date_create("2017-02-01");
$date2=date_create("2017-04-01");
$diff=date_diff($date1,$date2);

$res =  $diff->format("%R%a days");
echo ($res + 2);

【讨论】:

    【解决方案2】:

    PHP 有一些相当强大的 DateTime 类和函数。

    <?php
    
    $start = new DateTime('2017-05-01');
    $end = new DateTime('2017-07-03');
    $interval = new DateInterval('P1D');
    $period = new DatePeriod($start, $interval, $end);
    
    $output = ['daysTotal' => 0, 'months' => []];
    $months = [];
    foreach ($period as $dt) {
        if (!in_array($dt->format("F"), $months)) {
            $month = ['name' => $dt->format("F"), 'days' => cal_days_in_month(CAL_GREGORIAN, $dt->format("n"), $dt->format("Y"))];
            $output['months'][] = $month;
            $months[] = $dt->format("F");
    
        }
        $output['daysTotal']++;
    }
    
    var_dump($output);
    

    这将输出:

    array(2) {
      ["daysTotal"]=>
      int(63)
      ["months"]=>
      array(3) {
        [0]=>
        array(2) {
          ["name"]=>
          string(3) "May"
          ["days"]=>
          int(31)
        }
        [1]=>
        array(2) {
          ["name"]=>
          string(4) "June"
          ["days"]=>
          int(30)
        }
        [2]=>
        array(2) {
          ["name"]=>
          string(4) "July"
          ["days"]=>
          int(31)
        }
      }
    }
    

    注意:如果您在 2017-05-01 和 2017-06-01 之间进行,则不会在月份数组中记录六月。

    【讨论】:

      【解决方案3】:

      试试这个

      $from_date = "2017-02-01";
      $to_date = "2017-04-01";
      $start = $month = strtotime($from_date);
      $tmp = cal_days_in_month(CAL_GREGORIAN,date('m',strtotime($to_date)),date('Y',strtotime($to_date)));
      $end = strtotime(date('Y-m',strtotime($to_date)).'-'.$tmp);
      while($month < $end){
          $days = cal_days_in_month(CAL_GREGORIAN,date('m',$month),date('Y',$month));
          if(date('m',$start) == date('m',$month)) {
              $days = $days - date('d',$start) + 1;
          } else if(date('m',$end) == date('m',$month)) {
              $days = date('d',strtotime($to_date));
          }
          echo "Days :".$days." Month :".date('F',$month);
          echo '<br>';
          $month = strtotime("+1 month", $month);
      }
      

      输出如下所示

      Days :28 Month :February Days :31 Month :March Days :01 Month :April
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多