从毫秒获取日期格式 m-d-Y H: i: s.u

我试图获得一个格式化的日期,包括来自 UNIX 时间戳的微秒(以毫秒为单位)。

唯一的问题是我一直得到000000,例如。

$milliseconds = 1375010774123;
$d = date("m-d-Y H:i:s.u", $milliseconds/1000);
print $d;

07-28-201311:26:14.000000

328084 次浏览

Php.net 说:

微秒(在 PHP 5.2.2中添加)。请注意,date()将始终生成 000000,因为它接受一个整数参数,而如果 DateTime是用微秒创建的,则 DateTime::format()支持微秒。

因此,简单地使用:

$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";

推荐并使用参考的 dateTime()类:

$t = microtime(true);
$micro = sprintf("%06d",($t - floor($t)) * 1000000);
$d = new DateTime( date('Y-m-d H:i:s.'.$micro, $t) );


print $d->format("Y-m-d H:i:s.u"); // note at point on "u"

注意 u为微秒(1秒 = 100000μs)。

Php.net的另一个例子:

$d2=new DateTime("2012-07-08 11:14:15.889342");

Php.net上的 dateTime()参考文献

我已经简短地回答了作者的问题。请参阅作者的更多信息: 从毫秒获取日期格式 m-d-Y H: i: s.u

文件说明如下:

微秒(在 PHP 5.2.2中添加)。请注意,date ()将始终 生成000000,因为它接受一个整数参数,而 Format ()确实支持微秒。

也就是说,使用日期时间代替。

这里有一个稍微短一点的方法。我没有创建高精度的数字日期/时间,而是将微秒值转换为字符串,删除 0,并将其添加到日期/时间字符串的末尾。我可以通过调整字符串长度参数轻松地修剪小数的数目; 在这里,我使用 4获得毫秒,但是您可以使用 7获得微秒。

$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);

对于微时()值 0.98236000 1407400573,返回 08-07-14 01:08:13.982

// Procedural
$fineStamp = date('Y-m-d\TH:i:s') . substr(microtime(), 1, 9);
echo $fineStamp . PHP_EOL;


// Object-oriented (if you must). Still relies on $fineStamp though :-\
$d = new DateTime($fineStamp);
echo $d->format('Y-m-d\TH:i:s.u') . PHP_EOL;

您可以使用输入格式 U.u轻松地完成此操作。

$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");

这产生了以下结果:

04-13-2015 05:56:22.082300

来自 PHP 日期格式手册页:

  • U = Unix 时代以来的秒数
  • U = 微秒

Http://php.net/manual/en/function.date.php


感谢 Giggsey 指出了我原来答案中的一个缺陷,把 number_format()加到这行应该可以解决第二个问题。可惜感觉不再那么优雅了。

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));

Http://php.net/manual/en/function.number-format.php


关于时区的注释,以回应戴维。

通常,如果没有指定本地时区,createFromFormat()方法将使用本地时区。

Http://php.net/manual/en/datetime.createfromformat.php

然而,这里描述的技术是使用 microtime()初始化 DateTime 对象,它返回自 Unix Epoch (1970年1月1日00:00:00 GMT)以来经过的秒数。

Http://php.net/manual/en/function.microtime.php

这意味着 DateTime 对象被隐式初始化为 UTC,这对于只想跟踪运行时间的服务器内部任务很好。

如果您需要显示特定时区的时间,那么您需要相应地设置它。然而,由于上面讨论的原因,这应该在初始化之后作为一个单独的步骤来完成(没有使用 createFromFormat()的第三个参数)。

setTimeZone()方法可以用来完成这个需求。

Http://php.net/manual/en/datetime.settimezone.php

举个例子:

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';


$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';

产生以下产出:

10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818

注意,如果您想要输入 mysql,时间格式需要是:

format("Y-m-d H:i:s.u")

出于某种原因,如果你想格式化一个日期,比如 JavaScript 的 (new Date()).toISOString(),这就是你在 PHP 中可以做到的:

$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));

输出样本:

2016-04-27T18:25:56.696Z

只是为了证明减去整数并不会降低小数部分的精确度:

>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"

PHP是的是小数点后四舍五入的,但在这两种情况下都是以同样的方式进行四舍五入。

这是基于 ArchCodeMonkey 的答案。

但是如果你只是想要一个快速有效的东西,那就简化一下。

function DateTime_us_utc(){
return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
$now = DateTime_us_utc();
return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}

所以对我来说

$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");
# PHP 8 type safe when using declare(strict_types=1);
echo date('m-d-Y H:i:s').substr((string) fmod(microtime(true), 1), 1, 4);

示例输出:

02-06-2019 16:45:03.53811192512512

如果您需要限制小数位数,那么下面的行(credit mgutt)将是一个很好的选择。(在下面的代码中,6将小数位数限制为6。)

echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));

示例输出:

02-11-2019 15:33:03.624493

我很有用

echo date("Y-m-d H:i:s.").gettimeofday()["usec"];


output: 2017-09-05 17:04:57.555036

现在使用 PHP 7.0 + ,您可以执行以下操作:

$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));

按照以下顺序:

  1. 修剪字符串的最后4个零,以便 Date()可以处理日期。
  2. 使用 date 将毫秒格式化为 DateTime 可以理解的日期时间字符串。
  3. 然后,DateTime()可以允许您修改所在的时区,但要确保在使用 DateTime()函数和类之前设置了 date_default_timezone_set("Timezone");
  4. 最好在类中使用构造函数,以确保使用 DateTime()类或函数时处于正确的时区。

在 PHP 7.1中,您可以简单地这样做:

$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );

它将显示如下:

04-11-2018 10:54:01.321688

下面是我发现的另一种稍微更优雅/简单的方法:

echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));

如果您正在使用 Carbon,您可以使用定义的规范“ RFC3339 _ EXTENDED”。 或者定制它。

Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';

基于@ArchCodeMonkey 的答案。

如果有 declare(strict_types=1),则必须将第二个参数强制转换为字符串

enter image description here

用于 PHP 8.0 +

这个 bug 最近已经被修复,现在您可以使用带有小数部分的 UNIX 时间戳了。

$milliseconds = 1375010774123;


$d = new DateTime( '@'. $milliseconds/1000 );
print $d->format("m-d-Y H:i:s.u");

产出:

07-28-201311:26:14.123000

对于 PHP < 8.0

您需要指定 UNIX 时间戳的格式,然后才能在 DateTime 对象中使用它。正如在其他答案中提到的,您可以简单地使用 createFromFormat()number_format()来解决这个 bug

$milliseconds = 1375010774123;


$d = DateTime::createFromFormat('U.v', number_format($milliseconds/1000, 3, '.', ''));
print $d->format("m-d-Y H:i:s.u");

产出:

07-28-201311:26:14.123000

对于 PHP < 7.3

如果您仍然使用7.3以上的 PHP,您可以用 U.u替换 U.v。这不会有什么不同,但是毫秒格式标识符只在 PHP 7.3之后才出现。

$milliseconds = 1375010774123;
//                                 V - Use microseconds instead of milliseconds
$d = DateTime::createFromFormat('U.u', number_format($milliseconds/1000, 3, '.', ''));
print $d->format("m-d-Y H:i:s.u");

产出:

07-28-201311:26:14.123000

这个函数可以从 php5.2工作到 php7.4:

#!/usr/bin/php
<?php


function dtfn ($t=null) // for filenames, date + time, year first, ms always 3 digits
{
if (!$t) $t = microtime(true);
$dtx = date('Y-m-d_H.i.s', $t);
$ms = sprintf("%03u", 1000 * fmod($t,1));
return "$dtx.$ms";
}


function xxx($t)
{
echo sprintf("%12s: %s\n", $t, dtfn($t));
}


xxx(1);
xxx(1.0);
xxx(1.01);
xxx(1.0101);
xxx(1.23456789);

结果:

           1: 1970-01-01_01.00.01.000
1: 1970-01-01_01.00.01.000
1.01: 1970-01-01_01.00.01.010
1.0101: 1970-01-01_01.00.01.010
1.23456789: 1970-01-01_01.00.01.234

Php > = 7.3的单行版本(可用作函数 param) :

printf("%s",




(DateTime::createFromFormat('U.u', microtime(true)))
->setTimezone(new \DateTimeZone('UTC'))
->format("Y-m-d.H:i:s.v")


);

参见 格式中的 vu