在 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解析器获取带有类的p标记中的所有子项

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

带有 Ajax 的 PHP 数组 - 获取数据的正确方法?

带有php echo的文本溢出div

PHP从带有数组[]的输入中获取发布数据

是否有一个带有/ORM(Laravel、Cake、Codeigniter)的 PHP 框架,我们可以在其中覆盖数据交互以从 rest api 中获取数据?