php for timeeach中时间段的倒序

问题描述 投票:8回答:4

嗨,我有脚本给了我一周之间的日期列表。我需要相反的顺序。alredy尝试了rsort,reverse_array以及更多一些错误提示。

谢谢。

脚本

$date2 = "$lastweek2";
$date1 = "$lastweek1";

$start    = new DateTime($date2);
$end      = new DateTime($date1);
$interval = DateInterval::createFromDateString('1 day');
$period   = new DatePeriod($start, $interval, $end);

echo "<br>";
foreach ($period as $dt) {
    echo $dt->format("Y-m-d") . "<br>\n";
}

echo就是这样

2014-08-09
2014-08-10
2014-08-11
2014-08-12
2014-08-13
2014-08-14
2014-08-15

反向

2014-08-15
2014-08-14
2014-08-13
2014-08-12
2014-08-11
2014-08-10
2014-08-09
php date foreach reverse dateinterval
4个回答
8
投票

只需将日期放入数组,然后使用array_reverse()反转数组的顺序

array_reverse()

26
投票

$ period = array_reverse(iterator_to_array($ period));


11
投票

使用一天间隔和两个日期之间的天数差异,您可以完成同一件事,而无需使用$dates = array(); foreach ($period as $dt) { $dates[] = $dt->format("Y-m-d"); } $dates = array_reverse($dates); echo implode("<br>\n", $dates); 或构建另一个数组。

示例:array_reverse(iterator_to_array())

https://3v4l.org/B3nNk

结果:

$start = new \DateTime('2014-08-15');
$end = new \DateTime('2014-08-09');
$diff = $end->diff($start);
$interval = \DateInterval::createFromDateString('-1 day');

$period = new \DatePeriod($start, $interval, $diff->days);
foreach ($period as $date) {
    echo $date->format('Y-m-d') . PHP_EOL;
}

这样,它告诉2014-08-15 2014-08-14 2014-08-13 2014-08-12 2014-08-11 2014-08-10 2014-08-09 从差异返回的天数中减去1天,而不是累加到结束日期。


注意:这种方法在少于一天的间隔内不起作用由于日期和日期的已知问题,因此可以识别DST的时区DST小时更改。 DatePeriod(扩展到https://bugs.php.net/bug.php?id=74274)和类似用法。

示例 DateTime::sub()

https://3v4l.org/2DKBs

结果

date_default_timezone_set('America/New_York');

$start = new DateTime('2020-03-08 04:00');
$interval = DateInterval::createFromDateString('-1 hour');

$period = new DatePeriod($start, $interval, 10);
foreach ($period as $date) {
    echo $date->format('Y-m-d h:i a') . PHP_EOL;
}

解决方法是使用无法识别DST的时区,例如UTC。目前,最佳做法是使用UTC时区作为内部申请日期,然后转换为所需的时区进行显示。

示例 2020-03-08 04:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am 2020-03-08 03:00 am

https://3v4l.org/3YflE

结果

date_default_timezone_set('UTC');

$start = new DateTime('2020-03-08 04:00');
$interval = DateInterval::createFromDateString('-1 hour');

$period = new DatePeriod($start, $interval, 10);
foreach ($period as $date) {
    echo $date->format('Y-m-d h:i a') . PHP_EOL;
}

2
投票
2020-03-08 04:00 am
2020-03-08 03:00 am
2020-03-08 02:00 am
2020-03-08 01:00 am
2020-03-08 12:00 am
2020-03-07 11:00 pm
2020-03-07 10:00 pm
2020-03-07 09:00 pm
2020-03-07 08:00 pm
2020-03-07 07:00 pm
2020-03-07 06:00 pm
© www.soinside.com 2019 - 2024. All rights reserved.