我有一个循环,从今天开始到一个旧的日期,将日期递减到每个循环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";
答案 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()。