Время текста на цифры - PullRequest
       6

Время текста на цифры

3 голосов
/ 01 августа 2010

У меня есть несколько строк со временем

"42 sec"
"1 min"
"2 h 32 min"

Возможно ли преобразовать это в

"00:00:42"
"00:01:00"
"02:32:00"

с помощью php?

Ответы [ 4 ]

7 голосов
/ 01 августа 2010

PHP strtotime() - это полезная функция, которая может преобразовывать строковое представление времени в метку времени Unix.Исходя из этого, мы можем затем преобразовать время в любой формат, который нам нравится.

Однако ваши исходные строки времени находятся не в формате, который strtotime() может обрабатывать напрямую.например.«ч» должен быть «час».Но, возможно, мы могли бы заменить их до перехода к strtotime (), если ваши данные непротиворечивы.

Обратите внимание, что мы пытаемся преобразовать исходное время относительно 0, а не текущее время.Будет выводить:

"42 sec" = "00:00:42"
"1 min" = "00:01:00"
"2 hour 32min" = "02:32:00"

Обратите внимание, что strtotime() понимает «sec», «second», «min», «minute» и «hour».И, кажется, обрабатывать пространство или нет места в порядке, например.«32 мин» или «32 мин» обрабатываются в порядке.

1 голос
/ 01 августа 2010

Не самое чистое решение, но оно работает для ваших трех случаев:

<?
    $time[] = "42 sec";
    $time[] = "1 min";
    $time[] = "2 h 32min";

    $seconds = '/([\d]{1,})\s?sec/';
    $minutes = '/([\d]{1,})\s?min/';
    $hours = '/([\d]{1,})\s?h/';

    foreach( $time as $t )
    {
        echo '<br />';
        preg_match( $hours, $t, $h );
        $hour = $h[1];
        if( $hour )
        {
            if( strlen( $hour )<2 )
                $hour = '0' . $hour;
        }
        else
            $hour = '00';


        preg_match( $minutes, $t, $m );
        $min = $m[1];
        if( $min )
        {
            if( strlen( $min )<2 )
                $min = '0' . $min;
        }
        else
            $min = '00';

        preg_match( $seconds, $t, $s );
        $sec = $s[1];
        if( $sec )
        {
            if( strlen( $sec )<2 )
                $sec = '0' . $sec;
        }
        else
            $sec = '00';

        echo $hour . ':' . $min . ':' . $sec;

    }
?>

Выходы:

00:00:42
00:01:00
02:32:00
0 голосов
/ 01 августа 2010

Я уверен, что есть лучшее решение, но оно работает.

function timetotime($str) {
    $match = null;
    if (preg_match("/(\d+)(\s?)h/", $str, &$match)) {
        $h = $match[1];
        if ($h < 10)
            $result = "0{$h}:";
        else
            $result = "{$h}:";
    } else 
        $result = "00:";

    if (preg_match("/(\d+)(\s?)min/", $str, &$match)) {
        $h = $match[1];
        if ($h < 10)
            $result .= "0{$h}:";
        else
            $result .= "{$h}:";
    } else
        $result .= "00:";

    if (preg_match("/(\d+)(\s?)sec/", $str, &$match)) {
        $h = $match[1];
        if ($h < 10)
            $result .= "0{$h}";
        else
            $result .= "{$h}";
    } else
        $result .= "00";

    return $result;
}
0 голосов
/ 01 августа 2010

http://php.net/manual/en/function.strtotime.php

<?php
$dates = array("42 sec", "1 min", "2 hour 32 min"); // normalise last item

foreach($dates as $d)
    printf("%5s - %s\n", $d, nSecs($d));

function nSecs($date)
{
    $t = strtotime("+1 day $date");
    return $t - strtotime("+1 day");
}
?>

Если вы можете нормализовать h => hour, это не так уж и плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...