【问题标题】:Adding 30 minutes to time formatted as H:i in PHP在 PHP 中添加 30 分钟格式为 H:i
【发布时间】:2011-02-15 13:27:35
【问题描述】:

此刻正在做噩梦,只是不明白为什么它不起作用

我有一个 H:i(即 10:00、13:30)等形式的值,称为 $time

我要做的是创建两个新值,$startTime 是 $time 前 30 分钟,$endTime 是 $time 后 30 分钟

我尝试了以下方法,但似乎不想工作

$startTime = date("H:i",strtotime('-30 minutes',$time));
$endTime = date("H:i",strtotime('+30 minutes',$time));

如果我通过 10:00 作为 $time 并回显 $startTime 和 $endTime 我得到:

$startTime = 00:30
$startTime = 01:30        

【问题讨论】:

  • $time变量是如何初始化的?
  • 在黑暗中拍摄,但您可以尝试不带 s 的 -30 minute 吗?
  • @Pekka 不是问题。不使用 $time 时,它​​工作正常。必须是一个糟糕的初始化值。
  • @Patonza 我是从查询字符串中获取的,它是从上一页的表单中传递的。 @Pekka 恐怕我已经试过了,同样的结果
  • @bateman 你能显示一个时间戳值吗?

标签: php strtotime


【解决方案1】:
$time = strtotime('10:00');
$startTime = date("H:i", strtotime('-30 minutes', $time));
$endTime = date("H:i", strtotime('+30 minutes', $time));

【讨论】:

    【解决方案2】:

    为了使其工作$time 必须是一个时间戳。您不能传入“10:00”或$time = date('H:i', '10:00'); 之类的东西,这就是您似乎所做的,因为那样我也会得到 0:30 和 1:30 作为结果。

    试试

    $time = strtotime('10:00');
    

    作为替代方案,请考虑使用 DateTime(虽然下面需要 PHP 5.3):

    $dt = DateTime::createFromFormat('H:i', '10:00'); // create today 10 o'clock
    $dt->sub(new DateInterval('PT30M'));              // substract 30 minutes
    echo $dt->format('H:i');                          // echo modified time
    $dt->add(new DateInterval('PT1H'));               // add 1 hour
    echo $dt->format('H:i');                          // echo modified time
    

    如果你不喜欢 OOP,也可以选择程序

    $dateTime = date_create_from_format('H:i', '10:00');
    date_sub($dateTime, date_interval_create_from_date_string('30 minutes'));
    echo date_format($dateTime, 'H:i');
    date_add($dateTime, date_interval_create_from_date_string('1 hour'));
    echo date_format($dateTime, 'H:i');
    

    【讨论】:

      【解决方案3】:

      我通常采取稍微不同的方式来实现这一点:

      $startTime = date("H:i",time() - 1800);
      $endTime = date("H:i",time() + 1800);
      

      其中 1800 秒 = 30 分钟。

      【讨论】:

        【解决方案4】:

        您当前的解决方案不起作用,因为$time 是一个字符串 - 它需要是一个 Unix 时间戳。你可以这样做:

        $unix_time = strtotime('January 1 2010 '.$time); // create a unix timestamp
        $startTime date( "H:i", strtotime('-30 minutes', $unix_time) );
        $endTime date( "H:i", strtotime('+30 minutes', $unix_time) );
        

        【讨论】:

          【解决方案5】:
          $time = 30 * 60; //30 minutes
          $start_time = date('Y-m-d h:i:s', time() - $time);
          $end_time = date('Y-m-d h:i:s', time() + $time);
          

          【讨论】:

          • Y-m-d H:i:s 不是h:i:s
          【解决方案6】:
          echo date( "Y-m-d H:i:s", strtotime("2016-10-10 15:00:00")+(60*30) );//2016-10-10 15:30:00
          

          echo date( "H:i:s", strtotime("15:00:00")+(60*30) ); // 15:30:00
          

          echo date( "H:i:s", strtotime(date("H:i:s"))+(60*30) ); // 15:30:00
          

          【讨论】:

            【解决方案7】:

            只是为了扩展以前的答案,执行此操作的函数可以像这样工作(根据this for function.datethis for DateInterval 更改您喜欢的时间和间隔格式):

            // Return adjusted start and end times as an array.
            
            function expandTimeByMinutes( $time, $beforeMinutes, $afterMinutes ) {
            
                $time = DateTime::createFromFormat( 'H:i', $time );
                $time->sub( new DateInterval( 'PT' . ( (integer) $beforeMinutes ) . 'M' ) );
                $startTime = $time->format( 'H:i' );
                $time->add( new DateInterval( 'PT' . ( (integer) $beforeMinutes + (integer) $afterMinutes ) . 'M' ) );
                $endTime = $time->format( 'H:i' );
            
                return [
                    'startTime' => $startTime,
                    'endTime'   => $endTime,
                ];
            }
            
            $adjustedStartEndTime = expandTimeByMinutes( '10:00', 30, 30 );
            
            echo '<h1>Adjusted Start Time: ' . $adjustedStartEndTime['startTime'] . '</h1>' . PHP_EOL . PHP_EOL;
            echo '<h1>Adjusted End Time: '   . $adjustedStartEndTime['endTime']   . '</h1>' . PHP_EOL . PHP_EOL;
            

            【讨论】:

              【解决方案8】:

              您需要的是比给定日期时间晚 30 分钟的日期时间,以及比给定日期时间早 30 分钟的日期时间。换句话说,您需要一个未来的日期时间和一个过去的日期时间。因此,实现这一目标的类称为FuturePast。他们需要什么数据来计算你需要什么?显然,他们必须有一个相对于计算这 30 分钟的日期时间,以及一个间隔本身——在你的情况下是 30 分钟。因此,所需的日期时间如下所示:

              use Meringue\ISO8601DateTime\FromCustomFormat as DateTimeCreatedFromCustomFormat;
              
              (new Future(
                  new DateTimeCreatedFromCustomFormat('H:i', '10:00'),
                  new NMinutes(30)
              ))
                  ->value();
              

              如果你想以某种方式格式化它,你可以这样做:

              use Meringue\ISO8601DateTime\FromCustomFormat as DateTimeCreatedFromCustomFormat;
              
              (new ISO8601Formatted(
                  new Future(
                      new DateTimeCreatedFromCustomFormat('H:i', '10:00'),
                      new NMinutes(30)
                  ),
                  'H:i'
              ))
                  ->value();
              

              它更冗长,但我想它比内置的 php 函数更简单。

              如果您喜欢这种方法,您可以了解有关此示例中的meringue library usedthe overall approach 的更多信息。

              【讨论】:

                猜你喜欢
                • 2019-05-27
                • 1970-01-01
                • 2010-11-29
                • 1970-01-01
                • 2018-01-22
                • 2016-11-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多