【问题标题】:Get number of seconds from a suffixed string从后缀字符串中获取秒数
【发布时间】:2020-12-14 14:50:28
【问题描述】:

我希望能够从人类可以理解的格式解析时间规范,例如:

  • 2 小时

  • 40 秒

  • 50 米

  • 1天

其中 d 是可能的最大规格。

PHP 中是否有标准函数(包括 Carbon 或 Symfony 的任何部分)来解析这些规范,或者我应该自己实现它(相当简单)

【问题讨论】:

  • strtotime 和 Carbon::createFromDateString 都不能处理这个问题——我自己试过,PHP 7+
  • 在这种情况下,我们谈论持续时间或日期/时间...?因为,即使您将此模式转录为标准日期/时间格式,此处的日期值也不会被视为一天(24 小时)。我的建议如果它是一个常规的 pettern,你可以制作一个 php 函数将其转换为标准格式。
  • 这些不是日期或时间,而是持续时间。如果有的话,你会想看看DateInterval
  • @deceze 谢谢,这是一个部分解决方案,使我能够创建一个完全工作的解决方案
  • 您使用的语法由CarbonInterval::fromString开箱即用处理

标签: php symfony php-7 php-carbon


【解决方案1】:

感谢 deceze,我找到了这个解决方案:

$timeLimit =  new \DateInterval('PT' . strtoupper($timeLimitString));

其中“PT”是时间间隔的 ISO 前缀。

【讨论】:

    【解决方案2】:

    我想到了可以解析字符串和计算时间的自定义函数:

    <?php
    
    function str2time($input) {
        preg_match('/(\d+)(\D+)/', $input, $matches);
    
        switch ($matches[2]) {
            case 's':
            case 'sec':
                $time = (int)$matches[1];
            case 'm':
                $time = (int)$matches[1] * 60;
                break;
            case 'h':
                $time = (int)$matches[1] * 60 * 60;
                break;
            case 'd':
                $time = (int)$matches[1] * 60 * 60 * 24;
                break;          
            default:
                $time = 'wrong format';
        }
        
        return $time;
    }
    
    echo str2time('50m');
    

    测试这段代码here

    【讨论】:

    • 谢谢,但这里我想避免自定义代码。
    【解决方案3】:

    这在 Carbon 中作为间隔处理: https://carbon.nesbot.com/docs/#api-interval

    CarbonInterval::fromString('2h 40s 50m 1d')
    

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多