【问题标题】:php days between two dates list两个日期列表之间的php天数
【发布时间】:2012-09-26 20:18:16
【问题描述】:

看代码就知道问题出在哪里了?

如果你能帮助我,我会很高兴:

list($from_day,$from_month,$from_year)    = explode(".","27.09.2012");
list($until_day,$until_month,$until_year) = explode(".","31.10.2012");

$iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
$iDateTo   = mktime(0,0,0,$until_month,$until_day,$until_year);

while ($iDateFrom <= $iDateTo) {
    print date('d.m.Y',$iDateFrom)."<br><br>";
    $iDateFrom += 86400; 
}

同一题写2次的日期

10月(31)历史上写过2次画到10月30日结束:(

27.09.2012

28.09.2012

...

26.10.2012

27.10.2012

[[28.10.2012]]

[[28.10.2012]]

29.10.2012

30.10.2012

【问题讨论】:

  • 我复制粘贴了你的代码,没有任何问题......

标签: php list days


【解决方案1】:
  1. 您的问题是因为您已将时间设置为 00:00:00,将其设置为 12:00:00。那是因为Daylight saving time
  2. 停止使用 date() 函数,使用 Date and Time 类。

解决方案(PHP >= 5.4):

$p = new DatePeriod(
    new DateTime('2012-09-27'),
    new DateInterval('P1D'),
    (new DateTime('2012-10-31'))->modify('+1 day')
);
foreach ($p as $d) {
    echo $d->format('d.m.Y') . "\n";
}

解决方案(PHP
$end = new DateTime('2012-10-31');
$end->modify('+1 day');
$p = new DatePeriod(
    new DateTime('2012-09-27'),
    new DateInterval('P1D'),
    $end
);
foreach ($p as $d) {
    echo $d->format('d.m.Y') . "\n";
}

【讨论】:

  • 你确定是他的代码有问题吗?我刚刚在运行 PHP 5.3.13 的环境中运行了相同的代码,它运行良好。
  • 10 月有问题,吸引 31 - 到 30 写道:(
  • "那是因为夏令时。" - 授予
  • @BatuhanBerkayGöksu:我修复了代码,所以现在它应该可以工作了。但是,这是 php >= 5.4.x。如果没有,请在外部初始化最后一个 DatePeriod 参数,例如 $end = new DateTime('2012-10-31'); $end-&gt;modify('+1 day');
  • @glavić [2012 年 9 月 26 日 20:39:32 UTC] PHP 解析错误:语法错误,C:\Program Files (x86)\Zend\Apache2\htdocs\calendar\ 中的意外 T_OBJECT_OPERATOR第 134 行的 index.php 第 134 行 (new DateTime('2012-10-31'))->modify('+1 day')
【解决方案2】:

您遇到了夏令时问题。从一个时间戳到另一个添加秒很容易出现围绕这些边缘条件的问题(闰日可能有问题),您应该养成使用 PHP 的 DateTime 和 DateInterval 对象的习惯。它使处理日期变得轻而易举。

$start_date = new DateTime('2012-09-27');
$end_date = new DateTime('2012-10-31');
$current_date = clone $start_date;
$date_interval = new DateInterval('P1D');

while ($current_date < $end_date) {
    // your logic here

    $current_date->add($date_interval);
}

【讨论】:

  • [26-Sep-2012 20:42:48 UTC] PHP 可捕获的致命错误:DateTime 类的对象无法在 C:\Program Files (x86)\Zend\Apache2\ 中转换为字符串htdocs\calendar\index.php 在第 139 行 第 139 行 $current_date->add($date_interval); $start_date = new DateTime('2012-08-27'); $end_date = new DateTime('2012-09-31'); $current_date = 克隆 $start_date; $date_interval = new DateInterval('P1D');而 ($current_date add($date_interval); }
  • 您的错误在print $current_date。你需要使用类似print $current_date-&gt;format('d.m.Y');
【解决方案3】:

我解决这个问题的想法是这样的;

$firstDate = "27.09.2012";
$secondDate = "31.10.2012";

$daysDifference = (strtotime($secondDate) - strtotime($firstDate)) / (60 * 60 * 24);
$daysDifference = round($daysDifference);

for ($i = 0; $i <= $daysDifference; $i++)
{
    echo date("d.m.Y", strtotime('+'.$i.' day', strtotime($firstDate))) . "<BR>";
}

这应该可以解决您的问题并且更容易阅读(恕我直言)。我刚刚测试了代码,它输出所有日期,没有双打。它还可以让您避免所有的夏令时不一致。

【讨论】:

    【解决方案4】:

    我不知道您来自哪里,但您的时区很可能正处于夏令时转换(我住的地方是 11 月 4 日,正好是 10 月 28 日之后的一周)。你不能指望一天正好有 86400 秒长。

    如果你用 mktime 循环递增,你应该没问题:

    list($from_day,$from_month,$from_year)    = explode(".","27.09.2012");
    list($until_day,$until_month,$until_year) = explode(".","31.10.2012");
    
    $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
    $iDateTo   = mktime(0,0,0,$until_month,$until_day,$until_year);
    
    while ($iDateFrom <= $iDateTo)
    {
        print date('d.m.Y',$iDateFrom)."<br><br>";
        $from_day = $from_day + 1;
        $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
    }
    

    即使$from_day 可能会超过 31,mktime 也会为您进行数学转换。 (即 31 天的月份中的 32 天 = 下个月的第 1 天)

    编辑:对不起,我在错误的地方增加了。

    【讨论】:

    • 自 2012 年 9 月 27 日以来的前两次写入:(
    • 我的错,我把增量放错了地方。固定。
    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多