我目前有这种格式的日期
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
不存在。感谢。
答案 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'));
答案 5 :(得分:-1)
这是PHP解决方案:
根据mktime函数参数拆分您的(2010-03-03 10:39:18)日期字符串。
$solr_date = date('c', mktime($year,$month,$date, $h, $m , $s)); # it will work