在 php 中获取带有 seconds.decimal-fraction-of-second 日期的 ISO 8601?
Posted
技术标签:
【中文标题】在 php 中获取带有 seconds.decimal-fraction-of-second 日期的 ISO 8601?【英文标题】:get the ISO 8601 with seconds.decimal-fraction-of-second date in php? 【发布时间】:2011-09-03 06:20:36 【问题描述】:我附和这个:
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-fraction-of-second
我试过了:
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?
【问题讨论】:
【参考方案1】:作为 2020 年的解决方案,使用 PHP 5.2 中添加的 DateTime 类,您可以做一个简单的单行来获得所需的格式。
例如:
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 世界中广泛传播,这也可能是一种可能的解决方案。
【讨论】:
【参考方案2】:如果解析 microtime
返回的字符串让您吐在嘴里,并且您不希望多个不同的时间戳一起混入输出中,您可以这样做:
$unow = microtime(true);
sprintf("%s.%06d%s", date("Y-m-d\TH:i:s", $unow), ($unow - floor($unow))*1e6, date("P", $unow));
【讨论】:
当microtime()
小于 0.1
时,大约有 10% 的时间失败,因为它不进行左 0 填充。例如。 .0272390
将显示为 .272390
。
这并不是一个“失败”,但是是的。编辑修复,微不足道。【参考方案3】:
通过进行单独的 [date] 调用,您有两个时间戳出现故障的可能性很小:例如调用日期为 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);
例如:
2015-07-19T16:59:16.0113674-07:00
【讨论】:
“源”链接引用了包含错误的 Lucky 代码。请参阅此答案以进行更正:) ***.com/a/38334226/614616【参考方案4】:最佳性能:
substr_replace(date('c'), substr(microtime(), 1, 8), 19, 0);
【讨论】:
【参考方案5】:date('Y-m-d\TH:i:s.uP')
u
微秒是在 PHP 5.2.2 中添加的。对于早期或(仍然)损坏的版本(请参阅 cmets):
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)))
【讨论】:
是的,但是 date('Ymd\TH:i:s.uP') 有一个错误 echo date('Ymd\TH:i:s.uP');=>2011-05-27T15 :55:31.000000+02:00 愚蠢的 PHP。那就去microtime
吧。 :)
不要这样做,你会生成两个或三个不同的时间戳,然后将它们组合起来。即使是“避免两次调用日期”版本也分别调用 date() 和 microtime() ,它们将返回不同的系统时间。见下文。以上是关于在 php 中获取带有 seconds.decimal-fraction-of-second 日期的 ISO 8601?的主要内容,如果未能解决你的问题,请参考以下文章
在 php 中获取带有 seconds.decimal-fraction-of-second 日期的 ISO 8601?
是否有一个带有/ORM(Laravel、Cake、Codeigniter)的 PHP 框架,我们可以在其中覆盖数据交互以从 rest api 中获取数据?