日期在Symfony中循环减去10分钟

时间:2019-09-10 11:08:25

标签: php symfony datetime

我有一个循环,从今天开始到一个旧的日期,将日期递减到每个循环10分钟

该代码仅在我的symfony 2.8中有问题... 我重写了没有symfony的代码进行测试,并且可以正常工作...

null

但是在我的symfony上下文中,subDateIntervalToDatetime函数说:2018-10-28 02:00:00减去10分钟是2018-10-28 02:50:00

该脚本仅在该日期有此错误...

我将此代码添加到函数中:


<?php
$start = new DateTime('2017-01-21T02:20:00+01:00');
$current = new DateTime('2019-01-01T02:20:00+01:00');

function dateIntervalToSeconds(\DateInterval $dateInterval)
{
    $reference = new \DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}

function subDateIntervalToDatetime(\DateTime $dateTime, DateInterval $dateInterval)
{
    $newTimestamp = $dateTime->getTimestamp() - dateIntervalToSeconds($dateInterval);
    // return new \DateTime("@$newTimestamp", $dateTime->getTimezone()); <= timezone isn't set properly ...
    $newDate = new \DateTime("@$newTimestamp");
    $newDate->setTimezone($dateTime->getTimezone());
    return $newDate;
}

$i = 0;
while($current->getTimestamp() > $start->getTimestamp()) {
    echo $i . ' '. $current->format('Y-m-d H:i:s') . ' -> ' . $start->format('Y-m-d H:i:s') . "\r\n";
    $current = subDateIntervalToDatetime($current, new \DateInterval('PT10M'));
    $i++;
}

但切勿输入if ...

我只是用此回声替换回声

        echo $dateTime->format('Y-m-d H:i:s') . ' -> ' . $newDate->format('Y-m-d H:i:s') . "\r\n";
        if ($dateTime  < $newDate) {
            die;
        }

现在我经历了if ...但是我总是遇到主要问题...

你能解释为什么吗?以及如何解决? (为什么这个日期特别?)

PS:在视频https://streamable.com/3vkxn

中寻找乐趣

编辑,这是我的symfony项目中的函数:

echo $dateTime->format('Y-m-d H:i:s') . ' ' . $dateTime->getTimestamp() .' -> ' . $newDate->format('Y-m-d H:i:s') . ' ' . $newDate->getTimestamp() . "\r\n";

1 个答案:

答案 0 :(得分:2)

我认为您做了太多不必要的逻辑。对我来说,就是正确地使用DateTime并减去interval

<?php

$start = new DateTime('2017-01-21T02:20:00+01:00');
$current = new DateTime('2019-01-01T02:20:00+01:00');
$tenMinInterval = new \DateInterval('PT10M');


for($i = 0; $current > $start; ++$i) {
   echo $i . ' '. $current->format('Y-m-d H:i:s') . ' -> ' . $start->format('Y-m-d H:i:s') . "\r\n";  
   $current->sub($tenMinInterval);
}

输出:

0 2019-01-01 02:20:00 -> 2017-01-21 02:20:00
1 2019-01-01 02:10:00 -> 2017-01-21 02:20:00
2 2019-01-01 02:00:00 -> 2017-01-21 02:20:00
3 2019-01-01 01:50:00 -> 2017-01-21 02:20:00
4 2019-01-01 01:40:00 -> 2017-01-21 02:20:00
5 2019-01-01 01:30:00 -> 2017-01-21 02:20:00
6 2019-01-01 01:20:00 -> 2017-01-21 02:20:00
7 2019-01-01 01:10:00 -> 2017-01-21 02:20:00
8 2019-01-01 01:00:00 -> 2017-01-21 02:20:00
9 2019-01-01 00:50:00 -> 2017-01-21 02:20:00
10 2019-01-01 00:40:00 -> 2017-01-21 02:20:00
11 2019-01-01 00:30:00 -> 2017-01-21 02:20:00
12 2019-01-01 00:20:00 -> 2017-01-21 02:20:00
13 2019-01-01 00:10:00 -> 2017-01-21 02:20:00
14 2019-01-01 00:00:00 -> 2017-01-21 02:20:00
15 2018-12-31 23:50:00 -> 2017-01-21 02:20:00
16 2018-12-31 23:40:00 -> 2017-01-21 02:20:00

关于您的情况,您正在使用时区和时间戳,将DateTime转换为时间戳时,会丢失有关时区的信息。如果要包括时区,请在$ start,$ current DateTime构造函数中进行设置,如果要将其转换为其他时区,请在DateTime上使用setTimezone()。