在php中获得带有second.decimal-fraction-of-second日期的ISO 8601?

时间:2011-05-27 09:25:10

标签: php datetime

我回应这个:

  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?

5 个答案:

答案 0 :(得分:11)

date('Y-m-d\TH:i:s.uP')
在PHP 5.2.2中添加了

u微秒。对于早期版本或(仍然)版本(见注释):

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)))

答案 1 :(得分:4)

最佳表现:

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

答案 2 :(得分:4)

  

通过单独[日期]调用,您很可能会有两个时间戳无序:例如,呼叫日期为1:29:22.999999,mircotime为1:29:23.000001。在我的服务器上,连续呼叫大约相隔10个。

Source

请改为尝试:

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

E.g:

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

答案 3 :(得分:0)

作为PHP 5.2中添加的DateTime类的2020年解决方案,您可以做一个简单的划线即可获得所需的格式。

例如:

echo (new DateTime())->format('Y-m-d\TH:i:s.uP');
// 2020-04-23T09:18:25.311075+02:00

DateTime类实现的DateTimeInterface具有用于广泛使用的日期格式的常量。如果您知道格式,则可以为此使用常量。

echo var_dump($datetime->format(DateTime::RFC3339_EXTENDED));
// 2020-04-23T09:18:25.311+02:00

由于面向对象的编程在PHP世界中广泛传播,因此这可能也是一种解决方案。

答案 4 :(得分:-1)

如果解析microtime返回的字符串会让你呕吐在嘴里,并且你不希望多个不同的时间戳一起进入你的输出,你可以这样做:

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