获取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 做了小数点后的位置,但是在这两种情况下,它们都以相同的方式四舍五入。