获取date格式mdY H:i:su从毫秒

我正在尝试获取一个格式化的date,包括从毫秒微秒。

唯一的问题是我一直得到000000

date("mdY H:i:su", $milliseconds/1000); 

恩。 2013年7月28日11:26:14.000000

PHP.NET说 :

微秒(在PHP 5.2.2中添加)。 请注意,date()将始终生成000000,因为它需要一个整数参数,而DateTime :: format()确实支持微秒(如果DateTime是以微秒创build的)。

所以使用简单:

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

build议使用dateTime()类引用:

 $t = microtime(true); $micro = sprintf("%06d",($t - floor($t)) * 1000000); $d = new DateTime( date('Ymd H:i:s.'.$micro, $t) ); print $d->format("Ymd H:i:su"); // note at point on "u" 

注意u是微秒(1秒= 1000000μs)。

更多样品:

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

在php.net上引用dateTime() : http : //php.net/manual/en/datetime.construct.php

我已经回答了问题,并简化为作者。 请参阅更多信息作者: 获取date格式mdY H:我:从毫秒

你可以用input格式Uu轻松做到这一点。

 $now = DateTime::createFromFormat('U.u', microtime(true)); echo $now->format("mdY H:i:su"); 

这会产生以下输出:

 04-13-2015 05:56:22.082300 

从date格式的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


关于DaVe的时区说明。

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

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

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

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

这意味着DateTime对象被隐式初始化为UTC,这对于仅仅需要追踪经过时间的服务器内部任务来说没有问题。

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

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

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

举个例子:

 $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); echo $now->format("mdY H:i:su") . '<br>'; $local = $now->setTimeZone(new DateTimeZone('Australia/Canberra')); echo $local->format("mdY H:i:su") . '<br>'; 

生成以下输出:

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

这是一个稍短的方法。 我不是创build一个高精度的数字date/时间,而是将微秒值转换为一个string,删除0 ,并将其添加到date/时间string的末尾。 我可以很容易地通过调整string长度参数来修整小数位数; 这里我用4来获得毫秒,但是你可以用7来获得微秒。

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

如果microtime()值为0.98236000 1407400573 ,则返回08-07-14 01:08:13.982

把事情简单化

 echo date('mdY H:i:').(date('s')+fmod(microtime(true), 1)); 

我用

 echo date("Ymd H:i:s.").gettimeofday()["usec"]; output: 2017-09-05 17:04:57.555036 
 // Procedural $fineStamp = date('Ymd\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('Ymd\TH:i:s.u') . PHP_EOL; 

这是基于来自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("mdY H:i:su"); 

该文件说明如下:

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

即,使用DateTime来代替。

如果你想格式化JavaScript的(new Date()).toISOString()出于某种原因,这是你如何能够在PHP中做到这一点:

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

示例输出:

 2016-04-27T18:25:56.696Z 

只是为了certificate减去整数不会降低小数部分的精度:

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

PHP 了小数点后的位置,但是在这两种情况下,它们都以相同的方式四舍五入。