2010-03-03 59 views
2

我現在有一個日期格式和另外一個DateTime問題

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所有其他 組件是強制性的。

我從另一個Q這裏得到了這個代碼,但它不起作用。 Solr的抱怨是「無效的時間字符串」:

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

當呼應$solr_date,上述尾隨Z是不存在的。謝謝。

+0

您正在尋找一個Java解決方案或PHP? – 2010-03-03 10:03:17

+0

@Bhushan:PHP,代碼示例看起來像。 – Tomalak 2010-03-03 10:06:17

+0

@pesar:您是否嘗試使用其中一個PHP庫與Solr進行交互? http://code.google.com/p/solr-php-client/ http://pecl.php.net/package/solr http://code.google.com/p/solphr/ – 2010-03-03 12:19:30

回答

-1

這是PHP的解決方案:

分裂您(2010-03-03十點39分18秒)日期字符串基於mktime函數的參數。所有的

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

+0

「 mktime()'是'mktime(小時,分鐘,秒,月,日,年)'...... – jensgram 2010-03-03 10:11:52

+0

它很可能*不會*工作。 'date('c',...)'將本地日期的格式設置爲「+00:00」,Solr預計UTC時間的後綴爲「Z」。 – Tomalak 2010-03-03 10:12:26

2

首先,值得注意的MySQL中該日期/時間列不存儲在任何特定的字符串格式。它們在打印時會轉換爲字符串,您可以選擇如何格式化它們。

如果您想要一個純粹的MySQL解決方案,與您的問題相關的功能包括獲取UTC時間的CONVERT_TZ()和根據需要顯示它的DATE_FORMAT()。例如: -

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'; 
?> 
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; 
    } 
+0

謝謝!這對我幫助很大。我花了很多時間尋找解決方案! – 2010-09-23 08:06:42

+0

沒問題,如果你喜歡答案,一定要投票 – 2010-09-23 14:04:10

+3

根據ISO 8601規範,你需要在所有字段上都有前導零。除了小時數字段之外,您都可以使用它們。 'G'應該是'H' - > Y-m-d \ TH:i:s \ Z – easement 2011-08-23 16:07:15

0

這是一個黑客的一點點,但它爲我工作:

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

這裏的另一個備選:

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

See it in action

2

只使用

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