您可以使用输入格式 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
针对 DaVe 的时区说明。
如果未指定,通常createFromFormat() 方法将使用本地时区。
http://php.net/manual/en/datetime.createfromformat.php
但是,这里描述的技术是使用 microtime() 初始化 DateTime 对象,它返回自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来经过的秒数。
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")