获取日期格式mdY H:i:su从毫秒开始

sli*_*lik 107 php

我试图获得格式化的日期,包括从毫秒开始的微秒.

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

date("m-d-Y H:i:s.u", $milliseconds/1000);
Run Code Online (Sandbox Code Playgroud)

恩.07-28-2013 11:26:14.000000

Arc*_*key 126

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

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

这会产生以下输出:

04-13-2015 05:56:22.082300
Run Code Online (Sandbox Code Playgroud)

从日期格式的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, '.', ''));
Run Code Online (Sandbox Code Playgroud)

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


关于DaVe的时区说明.

通常,createFromFormat()如果未指定一个本地时区,该方法将使用本地时区.

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

但是,此处描述的技术是初始化DateTime对象,使用microtime()该对象返回自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>';
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818
Run Code Online (Sandbox Code Playgroud)

请注意,如果要输入mysql,则时间格式必须为:

format("Y-m-d H:i:s.u")
Run Code Online (Sandbox Code Playgroud)

  • 注意:`DateTime :: createFromFormat('U.u',microtime(true));`如果`microtime(true)`在精确的秒上运行,`将返回false.它返回'1438616239'而不是'1438616239.000000'. (18认同)
  • 这应该是选定的答案.明确而且重点. (7认同)
  • 很好的解决方案,谢谢。看来我正在失去我的本地时间从微时创建 $now 。任何的想法? (2认同)
  • @daVe 我添加了一些有关时区的信息,我希望这就是您想要的。 (2认同)
  • `number_format` 始终是必需的,即使它不在精确的秒上。否则,您将受到 PHP 配置选项 `precision` 的支配(用于“显示”),从 PHP 7.0 开始,默认情况下它不够高,导致精度损失(不精确到微秒)。 (2认同)

Mar*_*vac 115

php.net说:

微秒(在PHP 5.2.2中添加).请注意,date()它将始终生成,000000因为它采用整数参数,而DateTime::format()如果DateTime使用微秒创建则支持微秒.

所以使用简单:

$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>";
Run Code Online (Sandbox Code Playgroud)

推荐和使用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"
Run Code Online (Sandbox Code Playgroud)

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

来自php.net的另一个例子:

$d2=new DateTime("2012-07-08 11:14:15.889342");
Run Code Online (Sandbox Code Playgroud)

dateTime()php.net上的参考

我对问题的回答很简短并且简化了作者.有关作者的更多信息,请参阅:获取日期格式mdY H:i:su从毫秒开始

  • 我通常选择第二种形式,因为它更容易阅读和理解.此外,DateTime比日期/时间功能更灵活,更健壮.处理微秒是一个例子. (4认同)
  • @Geo和AlBundy可能是你在php <5.2.2的机器上尝试这个吗?PHP 5.4.39运行完全正常... (3认同)

tho*_*tso 12

这是一个略短的方法.而不是创建工作高精度数字日期/时间,我微秒值转换为字符串,删除0,并添加到日期/时间字符串的结尾.我可以通过调整字符串长度参数轻松修剪小数位数; 这里我4用来获得毫秒,但你可以7用来获得微秒.

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

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


ghb*_*att 6

echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
Run Code Online (Sandbox Code Playgroud)

示例输出:

02-06-2019 16:45:03.53811192512512
Run Code Online (Sandbox Code Playgroud)

如果您需要限制小数位数,那么下面的行(信用mgutt)将是一个很好的选择.(使用下面的代码,6将小数位数限制为6.):

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

示例输出:

02-11-2019 15:33:03.624493
Run Code Online (Sandbox Code Playgroud)


bam*_*sza 6

我用了

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

output: 2017-09-05 17:04:57.555036
Run Code Online (Sandbox Code Playgroud)


小智 6

从 PHP 7.1 开始,您可以简单地执行以下操作:

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

它将显示为:

04-11-2018 10:54:01.321688
Run Code Online (Sandbox Code Playgroud)


Dha*_*man 5

对于 PHP 8.0+

该错误最近已修复,现在您可以使用带有小数部分的 UNIX 时间戳。

$milliseconds = 1375010774123;

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

输出:

07-28-2013 11:26:14.123000

对于 PHP < 8.0

您需要指定 UNIX 时间戳的格式,然后才能在 DateTime 对象中使用它。正如其他答案中所述,您可以通过使用createFromFormat()number_format()

$milliseconds = 1375010774123;

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

输出:

07-28-2013 11:26:14.123000

对于 PHP < 7.3

如果您仍在使用早于 7.3 的 PHP,则可以替换U.vU.u. 它不会有任何区别,但毫秒格式标识符仅从 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");
Run Code Online (Sandbox Code Playgroud)

输出:

07-28-2013 11:26:14.123000