【问题标题】:PHP + MySQL: Time as a string into numericsPHP + MySQL:将时间作为字符串转换为数字
【发布时间】:2011-08-17 08:03:05
【问题描述】:

我正在为我的项目创建一个钻取时间图表。

目前在数据库中,它将钻探持续时间存储为时间字段。 时间以 MM:SS 形式检索,因此 5 分 30 秒表示为 05:30 我选择的绘图包(jpgraph)需要将数值作为数组传递给它。

使用下面的代码我得到了这个:

数组 ( [0] => 00:03:25 [1] => 00:04:23 [2] => 00:03:48 [3] => 00:02:48 [4] => 00:03:09 [5] => 00:02:25)

我猜 00:03:25 是如何存储为字符串的(有什么方法可以确认动态类型?)。

我可能需要的是:

A) 以十进制分表示:

数组([0] => 3.417 [1] => 4.383 [2] => 3.800 [3] => 2.800 [4] => 3.150 [5] => 2.433)

B) 以整数秒表示:

数组([0] => 205 [1] => 267 [2] => 228 [3] => 168 [4] => 189 [5] => 145)

是否有任何现有功能已经这样做了,或者我必须使用正则表达式来完成这样的事情,因为 PHP idate 函数似乎合适但似乎只返回一个 0 数组给我(见下面的代码)...

当我从 SQL 中获取数据时,我会使用我制作的以下函数:

public static function queryDB($aSQLQuery,&$aResult,&$aNumResult){
    $aResult = mysql_query($aSQLQuery);
    $aNumResult = mysql_num_rows($aResult);
}

//Returns User aIDNum's 6 most recents attempts of aExcerNum
public static function getTimes($aIDNum, $aExcerNum, &$aResult,&$aNumResult){
    $query = "  SELECT * FROM (
                    SELECT *
                    FROM Times
                    WHERE   uid =   ".$aIDNum."     AND
                            exid =  ".$aExcerNum."  
                    ORDER BY Date DESC
                    LIMIT 6
                ) AS T1 ORDER BY Date ASC;";
    DBHelper::queryDB($query, $aResult, $aNumResult);
}

public static function processTimeData($aResult, $aNumResult, &$aArray){
    for( $i=0; $i<$aNumResult; $i++){
        $row = mysql_fetch_array($aResult);
        $aArray[$i] = DBHelper::txtP($row, 'Date');
    }
    $paddingData = 6 - $aNumResult;
    for ( $j=0; $j < $paddingData; $j++){
        $aArray[ ($j+$aNumResult) ] = 0;
    }
}

public static function txtP($aRow, $aString){
    return htmlspecialchars(stripslashes($aRow[$aString]));
}

这样使用:

DBHelper::getTimes($userID, $excerciseID, $aResult,$aNumResult);
DBHelper::processTimeData($aResult,$aNumResult,$timeData);

我尝试使用 PHP idate():

public static function processTimeData($aResult, $aNumResult, &$aArray){
    for( $i=0; $i<$aNumResult; $i++){
        $row = mysql_fetch_array($aResult);
        //Tried "i" (Minutes) and "s" (seconds)
                    $aArray[$i] = iDate("i",$aRow['Time']);
                    //$aArray[$i] = iDate("s",$aRow['Time']);
    }
    $paddingData = 6 - $aNumResult;
    for ( $j=0; $j < $paddingData; $j++){
        $aArray[ ($j+$aNumResult) ] = 0;
    }
}

结果:

数组([0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0)

【问题讨论】:

    标签: php mysql jpgraph


    【解决方案1】:

    嗯,你可以像这样转换成秒数:

    // "00:03:25" -> 205
    Date("s",strtotime("00:03:25")) + Date("i",strtotime("00:03:25"))*60 + Date("G",strtotime("00:03:25"))*3600;
    

    编辑:在代码中添加 strtotime()

    【讨论】:

    • 提出您的建议,即 (echo Date("s","00:03:25") + Date("i","00:03:25")*60 + Date(" G","00:03:25")*3600;) 产生:61200。我也尝试了查询中的所有值,它为所有值返回 61200。也只有 Date("G","00:03:25")*3600 似乎贡献了任何东西(17*3600),而其余的都是 0。
    • 因启发我的实际解决方案而受到鼓舞!
    • 是的,抱歉,忘记了一个重要部分。 “strtotime(...)”函数。我会更新代码。
    【解决方案2】:

    自己找到了解决办法:

    感谢 Ragnar 帮助我思考问题!

    processTimeData 变化如下:

    public static function processTimeData($aResult, $aNumResult, &$aArray){
        for( $i=0; $i<$aNumResult; $i++){
            $row = mysql_fetch_array($aResult);
            $date = new DateTime( DBHelper::txtP($row,'Time') );
            $aArray[$i] = intval($date->format('s')) + intval($date->format('i'))*60 + intval($date->format('G'))*3600;
        }
        $paddingData = 6 - $aNumResult;
        for ( $j=0; $j < $paddingData; $j++){
            $aArray[ ($j+$aNumResult) ] = 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2018-03-29
      • 2012-05-21
      相关资源
      最近更新 更多