gpt4 book ai didi

php - 带微秒的日期时间

转载 作者:IT王子 更新时间:2023-10-29 01:21:57 26 4
gpt4 key购买 nike

在我的代码中,我使用 DateTime 对象来操作日期,然后将它们转换为时间戳,以便将它们保存在一些 JSON 文件中。

出于某些原因,我希望拥有与 DateTime 相同的东西(或类似的东西),但精度为微秒(在插入 JSON 文件时我会将其转换为 float )。

我的问题是:是否有一个类似于 DateTime,但也可以处理 微秒PHP 对象

目标是能够用对象操纵微时间。

date()文档中,有些内容表明 DateTime 可以用微秒创建,但我找不到方法。

u Microseconds (added in PHP 5.2.2). Note that date() will always generate 000000 since it takes an integer parameter, whereas DateTime::format() does support microseconds if DateTime was created with microseconds.

我尝试用浮点值 (microtime(true)) 设置 DateTime 对象的时间戳,但它不起作用(我认为它将时间戳转换为 int,导致微秒的损失)。

我是这样尝试的

$dt = new DateTime();
$dt->setTimestamp(3.4); // I replaced 3.4 by microtime(true), this is just to give an example
var_dump($dt);
var_dump($dt->format('u'));

如您在此处所见,.4 未被考虑在内(尽管我们可以使用对应于微秒的 u 格式)。

object(DateTime)[1]
public 'date' => string '1970-01-01 01:00:03' (length=19)
public 'timezone_type' => int 3
public 'timezone' => string 'Europe/Berlin' (length=13)

string '000000' (length=6)

编辑:我看到这段代码,它允许将微秒添加到 DateTime,但在创建 DateTime 之前我需要对微秒进行大量修改。因为我会经常使用它,所以我想在获取“microtime 对象”之前对 microtime 做尽可能少的修改。

$d = new DateTime("15-07-2014 18:30:00.111111");

最佳答案

这是创建包含微时间的 DateTime 对象的一个​​非常简单的方法。

我没有深入研究这个问题,所以如果我遗漏了什么,我深表歉意,但希望对你有所帮助。

$date = DateTime::createFromFormat('U.u', microtime(TRUE));
var_dump($date->format('Y-m-d H:i:s.u'));

我对其进行了测试并尝试了各种其他方法来使这项工作看起来合乎逻辑,但这是适用于 7.1 之前的 PHP 版本的唯一方法。

但是有一个问题,它返回了正确的时间部分而不是正确的日期部分(因为很可能是 UTC 时间)这就是我所做的(恕我直言,似乎仍然更简单):

$dateObj = DateTime::createFromFormat('U.u', microtime(TRUE));
$dateObj->setTimeZone(new DateTimeZone('America/Denver'));
var_dump($dateObj->format('Y-m-d H:i:s:u'));

这是一个工作示例:http://sandbox.onlinephpfunctions.com/code/66f20107d4adf87c90b5c8c914393d4edef180a2

更新
正如评论中指出的,从 PHP 7.1 开始,Planplan 推荐的方法似乎优于上面显示的方法。

所以,对于 PHP 7.1 及更高版本,使用下面的代码可能会更好,而不是上面的代码:

$dateObj = DateTime::createFromFormat('0.u00 U', microtime());
$dateObj->setTimeZone(new DateTimeZone('America/Denver'));
var_dump($dateObj->format('Y-m-d H:i:s:u'));

请注意,以上内容仅适用于 PHP 7.1 及以上版本。以前版本的 PHP 将返回 0 来代替 microtime,因此会丢失所有 microtime 数据。

这是一个更新的沙盒,显示了两者: http://sandbox.onlinephpfunctions.com/code/a88522835fdad4ae928d023a44b721e392a3295e

注意:在测试上述沙盒时,我从未见过 Planplan 提到他经历过的 microtime(TRUE) 故障。然而,更新后的方法似乎记录了 KristopherWindsor 建议的更高级别的精度。

注意 2:请注意,由于在 PHP DateTime 代码中对微秒的处理做出了基本决定,因此任何一种方法都可能会失败,这种情况很少见。要么:

  • 避免将其用于科学目的或任何需要非常高准确度的用途。
  • 或者准备好在精确的秒标记上没有返回微秒数据......(其中一微秒......即百万分之一秒,将没有数据返回,因为它完全为零......从我所读到的内容并不清楚返回的内容,可以以更好的方式完成,但值得创建代码来处理......再次,用于高精度用途)

感谢 Sz 的提醒。 (见评论)。

关于php - 带微秒的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33691428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com