从混合字符串转换为Unix时间戳

时间:2014-05-24 03:33:32

标签: php timestamp strtotime

今天我正在寻找一些帮助,我正在对我的数据库进行更新。在我们内部系统的先前版本中,我们使用以下样式字符串作为系统日志;

User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM

所有时间都以如上所示的单个字符串写入数据库,但是我希望对系统进行现代化并使用时间戳,以便可以对它们进行搜索。数据库中有数千条记录,所有记录都带有上述时间标记。

我正在寻找帮助打破字符串,提取时间然后将其转换为时间戳,然后将其保存到数据库。

到目前为止,我已尝试手动使用以下内容,以查看结果;

strtotime($string . " UTC+10");

使用诸如'now','today'和'June 31st'这样的术语似乎有效,但是'24 / 05/2014 - 12:26 PM'的字符串不起作用。

除了这个问题之外,我注意到日期信息之间使用/会强制脚本将其读作mm / dd / yyyy而不是dd / mm / yyyy

建议的方法是什么,记住我想从数据库中提取这些内容,获取时间戳,然后自动将其保存回数据库。服务器负载不是问题,因为它只需要发生一次。

一如既往地谢谢你。)


我根据提供的答案使用以下代码来快速有效地完成此操作。希望它能帮助别人!

<?php
    require_once("config.inc.php");

    $ProcessText = '';
    $QueryCount = 0;
    $sql = mysql_query("SELECT UNIX_TIMESTAMP(STR_TO_DATE(RIGHT(log,20), '%d/%m/%Y - %h:%i%p')),dbid FROM systemlogs WHERE `timestamp` = '';");
    while($data = mysql_fetch_array($sql)){
        $doupdate = mysql_query("UPDATE `systemlogs` SET `timestamp` = '".$data[0]."' WHERE `dbid` = '".$data[1]."' LIMIT 1");
        $ProcessText .= 'Updated: '.$data[1].' | Set Timestamp: '.$data[0];
        $QueryCount++;
    }

    //echo $ProcessText;
    echo '<strong>Total Queries Run: '.$QueryCount.'</strong>';

?>

1 个答案:

答案 0 :(得分:3)

因此,如果您正在寻找数据库解决方案并且它是mySQL,您可以使用以下方法构建更新语句:

select UNIX_TIMESTAMP( STR_TO_DATE('24/05/2014 - 12:26PM', '%d/%m/%Y - %h:%i%p') );

您要做的是使用SUBSTR或其他一些函数从您存储此日志信息的列中获取时间戳部分,然后像上面那样进行转换,然后使用UPDATE语句结合选择。

以下是一个完整的例子:

create database so1;
use so1;

create table logs ( old varchar(128), new bigint(20));
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM');
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:27PM');
INSERT INTO logs (old) VALUES ('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:28PM');

update logs a left join (SELECT  UNIX_TIMESTAMP ( STR_TO_DATE( RIGHT(old, 20), '%d/%m/%Y - %h:%i%p') ) as new, old FROM logs) b on a.old=b.old   set a.new = b.new;

工作原理:

我假设您的日志字符串最后20个字符始终是您尝试获取的时间戳。因此,SQL函数RIGHT(str,n)将返回某些n数据的最右侧str个字符。在这种情况下,我的示例中为old列。

所以:RIGHT('User Admin Logged in from xx.xx.xx.xx - 24/05/2014 - 12:26PM', 20)将返回24/05/2014 - 12:26PM

接下来,我们需要将该字符串转换为mysql可以理解的时间。 mySQL函数STR_TO_TIME就是为此而创建的。它需要两个参数:第一个是你要转换的字符串(我们的RIGHT函数的输出,然后第二个参数是将要解析的格式。在这种情况下,{{1} },你可以找到一个list of what each of those mean here但它的日/月/年是一个空格和破折号,然后是小时colin,分钟AM | PM。所以,mySQL会把你的字符串转换成它。如果你刚运行%d/%m/%Y - %h:%i%p + STR_TO_TIME您将获得一个日期时间列,但您说您想要一个时间戳......

所以最后我们进入转换的最后一步,简单地要求mySQL将datetime对象转换为带有RIGHT的时间戳。而且,这就是你想要的价值。

接下来是实际更新,这样你就可以在一次扫描中完成所有这些操作。对于mySQL存在称为“更新连接”的东西(我相信大多数sql)。语法是:

UPDATE table1 LEFT JOIN table2 ON .field = .field SET .somefield =

因此,我们希望更新我们的日志表(在示例中),并对列进行转换。因此,我们使用表格和转换结果执行JOIN。为了加入表格并确保匹配,我们也会从新结果中提取UNIX_TIMESTAMP列。这是代码中的很多单词:

old

我省略了查询以获取结果,以便您可以更轻松地查看更新语法。所以我们在这一点之后需要的是结果本身加入反对,使用上面的转换过程,以及我们需要让旧列加入我们组合的事实:

UPDATE logs a 
    LEFT JOIN (...) b ON a.old=b.old 
SET a.new = b.new;

和更新查询以获得最终结果:

SELECT UNIX_TIMESTAMP(STR_TO_DATE(RIGHT(old,20), '%d/%m/%Y - %h:%i%p')) AS new, old FROM logs