【问题标题】:How to use preg_replace to add one hour to a time value?如何使用 preg_replace 将一小时添加到时间值?
【发布时间】:2011-03-08 09:33:48
【问题描述】:

我有一个页面显示时间如下:10:00am。我需要花些时间,然后再增加一小时。我想出了一个正则表达式来处理自己查找时间,我只是不知道下一步该做什么。这是我的正则表达式:^(1[012]|[1-9]):([0-5][0-9])(?i)(am|pm)^.
任何帮助将不胜感激。 -奥斯汀

【问题讨论】:

    标签: php html regex


    【解决方案1】:

    您也可以使用这个单行代码:echo date("h:ia", strtotime("10:43am +1 hour"));,将 10:43 替换为一个插值变量,并确保它可以被 strtotime() 解析(您的示例格式是)。

    【讨论】:

      【解决方案2】:

      你可以这样做,不需要任何正则表达式:

      $time = '10:00am';
      list($hour, $min) = explode(':', $time);
      echo date('h:ia', mktime((int)$hour + 1, (int)$min));
      

      转换为int 去掉了尾随的am,以便在mktime 中使用分钟部分。

      如果您需要使用正则表达式(例如,您要在较大的字符串中搜索时间),您可以使用:

      preg_match('~^(1[012]|[1-9]):([0-5][0-9])(?i)(am|pm)^~', $str, $matches);
      echo date('h:ia', mktime($match[1] + 1, $match[2]));
      

      而且,如果您需要在原始字符串中替换这些时间,您可以使用preg_replace_callback

      $time = preg_replace_callback('~(1[012]|[1-9]):([0-5][0-9])(?i)(am|pm)~', 
                  function($matches) {
                      return date('h:ia', mktime($matches[1] + 1, $matches[2]));
                  },
              $time);
      

      PHP 5.2 及更早版本:

      $time = preg_replace_callback('~(1[012]|[1-9]):([0-5][0-9])(?i)(am|pm)~', 
                  create_function(
                      '$matches',
                      'return date(\'h:ia\', mktime($matches[1] + 1, $matches[2]));'
                  },
              $time);
      

      【讨论】:

      • 谢谢。你发布的最后一件事终于对我有用。非常感谢您的帮助。
      • 我不确定您现在是否可以提供帮助,但我有一个小问题。我测试了您在我的两个开发服务器(PHP 版本 5.3.1 和 5.3.5)上发布的最后一个方法,并且它在两者上都有效。但是,当我将文件上传到生产服务器(PHP 版本 5.2.13)时,它有一个解析错误(解析错误:语法错误,意外的 T_FUNCTION...)
      • 是的,lambda 函数在 5.2 中不受支持。您必须使用create_function() 而不是普通函数。以查看preg_replace_callback 的 PHP 手册为例。
      • 我还更新了我的答案以包含带有create_function 的版本。
      【解决方案3】:

      将时间解析为“部分”变量,执行修改,然后将部分放回新字符串中。

      例如:

      $time = '10:00am';
      $time = substr($time, 0, 5);
      $ampm = substr($time, 6);
      list($hours, $minutes) = explode(':', $time);
      
      // do your thing
      
      $newtime = sprintf('%02d:%02d%s', $hours, $minutes, $ampm);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        相关资源
        最近更新 更多