2011-05-27 53 views
9

餘回聲此:獲取ISO 8601與秒second.decimal-fraction-of-second日期在PHP?

php> echo date("Y-m-d\TH:i:s"); 
     2011-05-27T11:21:23 

如何與日期功能做的就是此日期格式:

2011-01-12T14:41:35.7042252+01:00(例如)

35.7042252 => seconds.decimal流分的秒

我曾嘗試:

php> function getTimestamp() 
... { 
...   return date("Y-m-d\TH:i:s") . substr((string)microtime(), 1, 8); 
... } 

php> echo getTimestamp(); 
2011-05-27T15:34:35.6688370 // missing +01:00 how can I do? 

回答

9
date('Y-m-d\TH:i:s.uP') 

u微秒添加在PHP 5.2.2中。對於早期或(仍然)破碎版本(見註釋):

date('Y-m-d\TH:i:s') . substr(microtime(), 1, 8) . date('P') 

或者,以避免兩次調用date

date(sprintf('Y-m-d\TH:i:s%sP', substr(microtime(), 1, 8))) 
+0

現在的工作,感謝 – newbie 2011-05-27 13:54:17

+0

肯定的,但日期( 'YMD \ TH:我:s.uP')有一個bug回聲日期( 'YMD \ TH:我:s.uP'); => 2011 -05-27T15:55:31.000000 + 02:00 – newbie 2011-05-27 13:56:09

+0

愚蠢的PHP。那麼去'microtime'。 :) – deceze 2011-05-27 13:58:44

3

最佳性能:

substr_replace(date('c'), substr(microtime(), 1, 8), 19, 0); 
4

這樣做單獨的[日期]呼叫您有兩個時間戳不可用的可能性很小:例如,呼叫日期爲1:29:22.999999,並且在1:29:23.000001時爲止。在我的服務器上,連續呼叫相距約10 us。

Source

試試這個:

list($usec, $sec) = explode(" ", microtime()); 
echo date("Y-m-d\TH:i:s", $sec) . substr($usec, 1, 8) . date("P", $sec); 

如:

2015-07-19T16:59:16.0113674-07:00 
+0

'源'鏈接引用包含錯誤的Lucky代碼。看到這個答案的更正:) http://stackoverflow.com/a/38334226/614616 – hozza 2016-07-12 16:55:14

-1

如果解析由microtime返回的字符串讓你在你的嘴裏吐了,而你沒有想要將多個不同的時間戳一起輸入到您的輸出中,您可以這樣做:

$unow = microtime(true); 
sprintf("%s.%06d%s", date("Y-m-d\TH:i:s", $unow), ($unow - floor($unow))*1e6, date("P", $unow)); 
+0

當'microtime()'小於'0.1',因爲它沒有做左0 -填充。例如。 「.0272390」將顯示爲「.272390」。 – jchavannes 2016-05-22 18:00:09

+0

這確實不是一個「失敗」,但是。編輯修復,平凡。 – jab 2016-05-24 21:54:33