另一个dateTime问题

时间:2010-03-03 09:56:41

标签: php mysql datetime solr

我目前有这种格式的日期

2010-03-03 10:39:18

这是MySQL中的TIMESTAMP字段。对于名为Solr的搜索引擎,我需要使用这种格式的日期:

1995-12-31T23:59:59Z

以下是他们网站上关于日期的一些文字:

  

Solr期望日期为UTC时   索引。此日期的格式   字段是形式   1995-12-31T23:59:59Z,是一个更多   限制形式的规范   dateTime的表示   http://www.w3.org/TR/xmlschema-2/#dateTime。   尾随“Z”表示UTC时间   并且是强制性的。可选的分数   允许秒数:   1995-12-31T23:59:59.999Z所有其他   组件是强制性的。

我在SO上从另一个Q获得了这个代码,但它不起作用。索尔抱怨“时间字符串无效”:

$solr_date = date('c', (strtotime($date_from_mysql)); // doesn't work

当回显$solr_date,时,上面提到的尾随Z不存在。感谢。

6 个答案:

答案 0 :(得分:5)

为什么不直接将其转换为UTC?

    $datetime = "2010-01-19 00:00:00";
    echo "Datetime Before: ".$datetime."<br />";
    $dttostr = strtotime("2010-01-19 00:00:00");
    echo "Datetime After: ".formatToUTC($dttostr)."<br />";
    echo "System Timezone: ".date_default_timezone_get()."<br />";

    function formatToUTC($passeddt) {
        // Get the default timezone
        $default_tz = date_default_timezone_get();

        // Set timezone to UTC
        date_default_timezone_set("UTC");

        // convert datetime into UTC
        $utc_format = date("Y-m-d\TG:i:s\Z", $passeddt);

        // Might not need to set back to the default but did just in case
        date_default_timezone_set($default_tz);

        return $utc_format;
    }

答案 1 :(得分:2)

首先,值得注意的是MySQL中的日期/时间列不以任何特定的字符串格式存储。它们在打印时会转换为字符串,您可以选择如何格式化它们。

如果您需要纯MySQL解决方案,则与您的问题相关的功能包括CONVERT_TZ()以获取UTC时间,DATE_FORMAT()以根据需要显示它。 E.g:

SELECT CURRENT_TIMESTAMP,
    CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'),
    DATE_FORMAT(CONVERT_TZ(CURRENT_TIMESTAMP, '+01:00', '+00:00'), '%Y-%m-%dT%H:%i:%sZ')

问题基本上是您必须事先知道您的时区,因为TIMESTAMP列不允许存​​储此类信息。此外,您可能会发现夏令时问题。

关于PHP,date()函数允许组合格式代码,您不仅限于一个:

<?php
$ts = strtotime($date_from_mysql);
$solr_date date('Y-m-d', $ts) . 'T' . date('H:i:s', $ts) . 'Z';
?>

答案 2 :(得分:2)

只需使用

gmdate('Y-m-d\TH:i:s\Z', $time);

答案 3 :(得分:0)

这有点像黑客但它对我有用:

$to = date('c', strtotime($to)).'.000Z';

答案 4 :(得分:0)

这是另一种选择:

$datetime = new DateTime('2010-01-19 00:00:00');
echo str_replace('+00:00', 'Z', $datetime->format('c'));

See it in action

答案 5 :(得分:-1)

这是PHP解决方案:

根据mktime函数参数拆分您的(2010-03-03 10:39:18)日期字符串。

$solr_date = date('c', mktime($year,$month,$date, $h, $m , $s)); # it will work