【问题标题】:Get all dates between now and x days from now获取从现在到 x 天之间的所有日期
【发布时间】:2013-12-17 22:05:37
【问题描述】:

我正在尝试调用一个函数,该函数将返回从现在到过去的可变天数之间的所有天数。下面是一些与真实代码混合的伪代码。你们能帮忙让它返回所有天的数组吗?

function getTimeStamps($numDays){
    $today = date("Y-m-d");
    $startDate = $today - $numdays;
    $movingDay = $startDate;

    $results = array();
    while($movingDay <= $today){
        array_push($results,$movingDay);
        $movingDay + 1 day;
    }
    return $results;
}
    $dateList = getTimeStamps(8);

这个函数会返回

array(
    '2013-12-10',
    '2013-12-11',
    '2013-12-12',
    '2013-12-13',
    '2013-12-14',
    '2013-12-15',
    '2013-12-16',
    '2013-12-17'
);

【问题讨论】:

  • 所以你返回的数据显示的是getTimeStamps(8)的结果?
  • 没错。我忘了添加那部分。
  • 最好有一个生成器而不是一个数组?
  • 可能是的。我只是说数组,因为我是一个 php 菜鸟
  • 不过,这实际上取决于您想对最终结果做什么。

标签: php arrays loops datetime


【解决方案1】:

这应该可以完成您需要的繁重工作。您可以修改它以适合您的确切目的。

$start    = new DateTime('2013-12-01');
$end      = new DateTime('2013-12-17');
$interval = new DateInterval('P1D');
$period   = new DatePeriod($start, $interval, $end);

foreach ($period as $dt)
{
    echo $dt->format("Y-m-d") . PHP_EOL;
}

See it in action

【讨论】:

    【解决方案2】:
    function getTimeStamps($numDays){
         $dates = array();
         for ($i=$numDays-1; $i>=0; $i--){
             $dates[] = date("Y-m-d", strtotime("now - $i days"));
         }
         return $dates;
    }
    

    所以...

    print_r(getTimeStamps(8));
    

    打印出来:

    Array
    (
        [0] => 2013-12-10
        [1] => 2013-12-11
        [2] => 2013-12-12
        [3] => 2013-12-13
        [4] => 2013-12-14
        [5] => 2013-12-15
        [6] => 2013-12-16
        [7] => 2013-12-17
    )
    

    【讨论】:

      【解决方案3】:

      约翰的回答很棒;作为补充,这是一个使用更老式时间戳的示例,包装在生成器中:

      function getPastDates($daysAgo)
      {
          $current = strtotime(sprintf('-%d days', $daysAgo));
      
          for ($i = 0; $i < $daysAgo; ++$i) {
              yield $current;
              $current = strtotime('+1 day', $current);
          }
      }
      
      foreach (getPastDates(7) as $ts) {
          echo date('Y-m-d', $ts), "\n";
      }
      

      【讨论】:

        【解决方案4】:

        此函数将返回填充有DateTime 对象的数组,从今天到今天+X 天:

        function getTimeStamps($numDays) {
            $now      = new DateTime('today');
            $interval = new DateInterval('P1D');
            $periods  = new DatePeriod($now, $interval, $numDays-1);
            return iterator_to_array($periods);
        }
        

        如果您希望以不同的方式格式化日期,只需循环它们即可:

        $datesBefore = getTimeStamps(4);
        $datesAfter = array_map(function($dt) { return $dt->format('Y-m-d'); }, $datesBefore);
        

        demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 2013-07-07
          • 2012-12-10
          • 1970-01-01
          • 2013-08-09
          • 2017-11-16
          相关资源
          最近更新 更多