10

嗨,我有脚本给了我一周之间的日期列表。我需要颠倒顺序。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";
}

回声是这样的

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
4

5 回答 5

30
$period = array_reverse(iterator_to_array($period));
于 2015-08-28T14:08:52.817 回答
16

使用的一天间隔和两个日期之间的天数差异,您可以完成相同的事情,而无需使用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');

/* 
//alternative usage

$interval = new \DateInterval('PT0S'); //0 duration
$interval->d = -1; //negative value
*/
    
$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

通过这种方式,它告诉DatePeriod从差异返回的天数减去 1 天,而不是加起来直到结束日期。


夏令时错误(PHP < 8.1)

注意:由于日期和 DST 小时更改的已知问题,此方法不适用于少于一天的时间间隔且时区可识别 DST。https://bugs.php.net/bug.php?id=74274,扩展至DateTime::sub(),以及类似的用法。在 PHP 8.1 中修复

示例 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;
}

结果

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

DST 解决方法和最佳实践

解决方法是使用无法识别 DST 的时区,例如 UTC。使用 UTC 时区作为内部应用程序日期并转换为所需的时区进行显示,目前被认为是最佳实践。

示例 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;
}

结果

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
于 2016-03-08T01:05:29.580 回答
13

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

$dates = array();
foreach ($period as $dt) {
    $dates[] = $dt->format("Y-m-d");
}

$dates = array_reverse($dates);
echo implode("<br>\n", $dates);
于 2014-08-15T20:29:29.543 回答
2
$date1 = "2014-08-15";
$date2 = "2014-08-09";

$start    = new DateTime($date2);
$end      = new DateTime($date1);
$i = DateInterval::createFromDateString('1 day');
while ($end >= $start) {
  echo $end->format("Y-m-d") . "<br>\n";
  $end = $end->sub($i);
}
于 2014-08-15T20:35:58.060 回答
0
$from_date = date("Y-m-01");
$to_date = date("Y-m-d");

while (strtotime($to_date) >=strtotime($from_date))
{
    $to_date = date ("Y-m-d", strtotime("-1 day", strtotime($to_date)));

    echo "From date: $to_date, to date: $to_date<br>";
}

输出是:

从日期:2021-08-24,到日期:2021-08-24

从日期:2021-08-23,到日期:2021-08-23

从日期:2021-08-22,到日期:2021-08-22

从日期:2021-08-21,到日期:2021-08-21

从日期:2021-08-20,到日期:2021-08-20

从日期:2021-08-19,到日期:2021-08-19

从日期:2021-08-18,到日期:2021-08-18

从日期:2021-08-17,到日期:2021-08-17

从日期:2021-08-16,到日期:2021-08-16

从日期:2021-08-15,到日期:2021-08-15

从日期:2021-08-14,到日期:2021-08-14

从日期:2021-08-13,到日期:2021-08-13

从日期:2021-08-12,到日期:2021-08-12

从日期:2021-08-11,到日期:2021-08-11

从日期:2021-08-10,到日期:2021-08-10

从日期:2021-08-09,到日期:2021-08-09

从日期:2021-08-08,到日期:2021-08-08

从日期:2021-08-07,到日期:2021-08-07

从日期:2021-08-06,到日期:2021-08-06

从日期:2021-08-05,到日期:2021-08-05

从日期:2021-08-04,到日期:2021-08-04

从日期:2021-08-03,到日期:2021-08-03

从日期:2021-08-02,到日期:2021-08-02

从日期:2021-08-01,到日期:2021-08-01

于 2021-08-25T15:52:04.927 回答