【问题标题】:PHP - handling DateTime variables and creating a rangePHP - 处理 DateTime 变量并创建一个范围
【发布时间】:2016-02-03 18:43:55
【问题描述】:

我想创建一个从开始日期到结束日期的 DateTime 变量数组。我正在使用以下函数来创建值数组。

<?php 
class utility 
{

    // constructor
    function __construct()
    {

    }

    /* Creates an array of dates in YYYY-MM-DD format
    * INPUT:
    *          @ From
    *          @ To 
    * OUTPUT:
    *          @ ArrayOfDates
    */ 

    function createDateRangeArray($strDateFrom,$strDateTo)
    {
        $aryRange = array();

        $iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),     substr($strDateFrom,8,2),substr($strDateFrom,0,4));
        $iDateTo=mktime(1,0,0,substr($strDateTo,5,2),     substr($strDateTo,8,2),substr($strDateTo,0,4));   

        if ($iDateTo>=$iDateFrom)
        {
             array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry
             while ($iDateFrom<$iDateTo)
             {
                 $iDateFrom+=86400; // add 24 hours 
                 array_push($aryRange,date('Y-m-d',$iDateFrom));
             }
        }
        return $aryRange;
     }
  }?>

当我询问从 2016-01-01 到 2016-01-06 的数组时,结果数组是正确的:

From: 2016-01-01
To: 2016-01-06
Number of dates: 6
2016-01-01,2016-01-02
2016-01-02,2016-01-03
2016-01-03,2016-01-04
2016-01-04,2016-01-05
2016-01-05,2016-01-06

问题:

如果时间段是从 2016-01-06 到 2016-01-09,则数组完全错误。

From: 2016-01-06
To: 2015-12-31
Number of dates: 0

我错过了什么?

支持

您可以使用以下代码测试该功能。

<?php
    require_once 'utility.php';
    $utility = new utility();

    $yearFrom = 2016; $monthFrom = 01; $dayFrom = 06;
    $yearTo = 2016; $monthTo = 01; $dayTo = 09;

    $from = new DateTime($yearFrom.'-'.$monthFrom.'-'.$dayFrom);
    echo "<div>From: <b>". $from->format('Y-m-d') . "</b> </div>";
    $to = new DateTime($yearTo.'-'.$monthTo.'-'.$dayTo);
    echo "<div>To: <b>" . $to->format('Y-m-d') . "</b> </div>";

    $arrayDate = $utility->createDateRangeArray($from->format('Y-m-d'),$to->format('Y-m-d'));

    echo "<div> Number of dates: " . count($arrayDate) . " </div>" ;

    for ($i = 0; $i < count($arrayDate)-1  ; $i++)
    {
        echo "<div> " . $arrayDate[$i] . "," . $arrayDate[$i+1] .  " </div>";
    }

?>

编辑

我注意到如果当天的数字是 9 而不是 09 它可以工作...

【问题讨论】:

  • 您可能想查看 PHP 联盟的 Period 包。它是专门为处理 PHP 中的时间范围而创建的。
  • 太好了@BenHarold!我一定会试试这个库。

标签: php arrays date datetime


【解决方案1】:

当您第一次实例化 DataTime 对象时,您似乎遇到了类型转换问题,如您的输出中所见,To 日期不正确:

From: 2016-01-06
To: 2015-12-31
Number of dates: 0

将 from 和 to 变量指定为字符串可以正确地显式实例化 DateTime:

$yearFrom = '2016'; $monthFrom = '01'; $dayFrom = '06';
  $yearTo = '2016'; $monthTo = '01'; $dayTo = '09';

输出:

From: 2016-01-06
To: 2016-01-09
Number of dates: 4
2016-01-06,2016-01-07
2016-01-07,2016-01-08
2016-01-08,2016-01-09

【讨论】:

  • 没问题 - 很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多