【问题标题】:Return array of date strings for a date range in php 5.2在 php 5.2 中返回日期范围的日期字符串数组
【发布时间】:2015-01-06 21:16:22
【问题描述】:

我有这个代码

<?php
function getDatesBetween2Dates($startTime, $endTime) {
  $day = 86400;
  $format = 'd-m-Y';
  $startTime = strtotime($startTime);
  $endTime = strtotime($endTime);
  $numDays = round(($endTime - $startTime) / $day) + 1;
  $days = array();

  for ($i = 0; $i < $numDays; $i++) {
      $days[] = date($format, ($startTime + ($i * $day)));
  }

  return $days;
}

$days = getDatesBetween2Dates(
  date('d-m-Y', strtotime("$start")),
  date('d-m-Y',strtotime("$end"))
);

foreach ($days as $key => $value) {
  // ...
}

然后继续搜索数据库并根据日期返回显示结果。这段代码不是我写的,也不知道从哪里得到的。

问题是返回两个 2014 年 11 月 2 日???它把每件事都搞砸了。 任何帮助都是极好的。我将尝试分享一个页面链接。 (该页面包含个人信息)

http://djwservices.co.uk/invoices/calendar.php

作为一个附带问题,如果有人可以让展开/缩小在 onclick 上工作,那将是很棒的。

提前致谢 达兹

【问题讨论】:

  • 为什么人们会错误地认为每天有 86400 秒长?
  • link 相关页面。
  • 我意识到并不是所有的日子都有 86400 秒,或者事实上没有一天是 24 小时,但仍然卡住了!
  • d-m-Y 是一种非常丑陋的格式,可用作您的日期字符串。你为什么要像喝醉的水手一样做字符串->日期->字符串?转到字符串应该是您在向人类展示之前做的最后一件事。在 PHP 中将事物保留为正常的时间戳,以通过模棱两可的字符串格式为您节省多次往返。
  • 正如我所说,我没有写这个,我根据理论工作.. 如果它没有坏,不要打破它!这一直有效到 2014 年 11 月 2 日。它现在坏了,我无法修复它?

标签: php date


【解决方案1】:

使用 PHP 5.5 生成器,您可以执行以下操作:

function period($begin, $interval, $end) {
    while ($begin <= $end) {
        yield $begin;
        $begin->add($interval);
    }
}

$interval = new \DateInterval('P1D');

$begin = new \DateTime( '2014-11-01' );
$end = new \DateTime( '2014-11-30' );

foreach (period($begin, $interval, $end) as $dt) {
    echo $dt->format( "Y-m-d" ), PHP_EOL;
}

【讨论】:

  • 也试过这个......解析错误:语法错误,第 12 行 /hermes/waloraweb034/b1699/moo.myeventpicturescouk/djw/invoices/test.php 中的意外 T_VARIABLE
  • 如我所说,此解决方案需要 PHP >= 5.5
【解决方案2】:

这应该更容易使用函数 date_diff。来自手册:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

如果您还没有 php 5.3,这里是一个修改版本:

function getDatesBetween2Dates($startTime, $endTime) {
    $datetime1 = new DateTime($startTime);
    $datetime2 = new DateTime($endTime);
    $interval = round(($datetime2->format('U') - $datetime1->format('U')) / (60*60*24));

    for ($i = 0; $i < $interval; $i++) {
       $dateTemp = $datetime1;
       $str = "+" . $i . " day";
       $dateTemp = $dateTemp->modify($str);
       $days[] = $dateTemp->format('d-m-Y');
    }

   return $days;
}

【讨论】:

  • 谢谢,尝试它得到这个错误致命错误:调用未定义的方法 DateTime::diff() in /hermes/waloraweb034/b1699/moo.myeventpicturescouk/djw/invoices/test.php 在第 12 行
  • 啊,那你不在 php 5.3 上。参考这个答案:stackoverflow.com/questions/4033224/…
  • 我添加了一个 php 5.2 友好的版本。
  • 还更新了它以返回您想要的格式。
  • 还更新了 for 循环,因此它现在在返回值中包含开始日期并且不包含结束日期(因此它更像原始)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2018-06-30
  • 1970-01-01
  • 2015-11-01
  • 2016-10-27
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多