【问题标题】:php reverse order of time period in foreachphp在foreach中将时间段倒序
【发布时间】:2023-03-11 15:28:01
【问题描述】:

嗨,我有脚本给我一个星期之间的日期列表。 我需要颠倒顺序。 已经尝试了 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

【问题讨论】:

  • 你有什么问题?你得到什么错误?显示给出错误的代码。
  • Negative DateInterval 的可能重复项

标签: php date foreach reverse dateinterval


【解决方案1】:
$period = array_reverse(iterator_to_array($period));

【讨论】:

    【解决方案2】:

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

    注意:这种方法不适用于少于一天的间隔 由于日期和日期的已知问题,识别 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
    

    【讨论】:

      【解决方案3】:

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

      $dates = array();
      foreach ($period as $dt) {
          $dates[] = $dt->format("Y-m-d");
      }
      
      $dates = array_reverse($dates);
      echo implode("<br>\n", $dates);
      

      【讨论】:

      • 嗨谢谢约翰它的工作 - 我遇到了另一个问题,我没有注意到我的代码给了我今天的日期 (16) - 但从昨天 (15-9) 算起一周我该如何解决这个问题
      • 2014-08-16 - today 2014-08-16 - 0 week ago 2014-08-09 - 1 week ago
      • 根据时间范围,这会导致内存使用率高且性能较慢。
      • 修复缺日问题
      【解决方案4】:
      $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);
      }
      

      【讨论】:

        【解决方案5】:
        $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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-06
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多