得到日期格式m-d-Y H:i:s.u从毫秒开始

时间:2013-07-28 15:35:26

标签: php

我正在尝试获取格式化日期,包括毫秒级的微秒。

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

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

离。 07-28-2013 11:26:14.000000

16 个答案:

答案 0 :(得分:113)

您可以使用输入格式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 = Microseconds

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 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")

答案 1 :(得分:110)

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>";

推荐并使用引用的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秒=1000000μs)。

php.net的另一个例子:

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

php.net

上引用dateTime()

我对问题的回答很简短并且简化了作者。有关作者的更多信息,请参阅:getting date format m-d-Y H:i:s.u from milliseconds

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:6)

我正在使用

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

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

答案 4 :(得分:5)

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

示例输出:

02-06-2019 16:45:03.53811192512512

如果您需要限制小数位数,那么下面的行(信用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

答案 5 :(得分:3)

对于PHP 8.0 +

该错误最近已得到修复,现在您可以使用UNIX时间戳(不包括小数部分)。

$milliseconds = 1375010774123;

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

输出:

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");

输出:

07-28-2013 11:26:14.123000

对于PHP <7.3

如果您仍在使用7.3之前的PHP,则可以将U.v替换为U.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");

输出:

07-28-2013 11:26:14.123000

答案 6 :(得分:2)

如果您出于某种原因要格式化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 确实围绕小数位,但在两种情况下都以相同的方式舍入它们。

答案 7 :(得分:2)

这是另一种我觉得更优雅/更简单的方法:

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

答案 8 :(得分:1)

// 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;

答案 9 :(得分:1)

这是基于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");

答案 10 :(得分:0)

文档说明如下:

  

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

即,改为使用DateTime。

答案 11 :(得分:0)

现在使用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()可以允许您修改所在的时区,但请确保在使用date_default_timezone_set("Timezone");函数和类之前设置了DateTime()
  4. 最好在类中使用构造函数,以便在使用DateTime()类或函数时确保您处于正确的时区。

答案 12 :(得分:0)

从PHP 7.1开始,你可以这样做:

04-11-2018 10:54:01.321688

它将显示为:

{{1}}

答案 13 :(得分:0)

如果您使用的是Carbon,则可以使用定义的规范“RFC3339_EXTENDED”。 或者自定义它。

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

答案 14 :(得分:0)

基于@ArchCodeMonkey答案。

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

enter image description here

答案 15 :(得分:-1)

我采用了几种不同的方法:

1)微型时间+ sscanf +日期:

react-router-dom

我不确定为什么microtime()在微秒部分返回10个字符(0.dddddd00),但是也许有人可以告诉我吗?

  function renderInventory(inventory) {
  //create a flat list
  var flatList = '';
  //iterate over the inventory
  for (var i = 0; i < inventory.length; i++) {
    var designerObject = inventory[i];
    var shoes = designerObject.shoes;
    //iterate over the each shoe in the array
    for (var j = 0; j < shoes.length; j++) {
      var currentShoe = shoes[j];
      //add the designer name, the shoe name, and the shoe price and the new line
      flatList = designerObject.name +", " + currentShoe.name +", " + currentShoe.price + '\n';
    } 
  }
  //return the flat list
  return flatList;
}
//assertion Function
function assertEqual(actual, expected, testName) {
  if (actual === expected) {
  console.log('passed');
  } else {
  console.log('FAILED [' + testName + '] Expected "' + expected + '", but got "' + actual + "'");
  }
}

//test cases

var currentInventory = [{
    name: 'Brunello Cucinelli',
    shoes: [
      {name: 'tasselled black low-top lace-up', price: 1000},
      {name: 'tasselled green low-top lace-up', price: 1100},
      {name: 'plain beige suede moccasin', price: 950},
      {name: 'plain olive suede moccasin', price: 1050}
    ]
  },
  {
    name: 'Gucci',
    shoes: [
      {name: 'red leather laced sneakers', price: 800},
      {name: 'black leather laced sneakers', price: 900}
    ]
  }
];

var actualFlatList = renderInventory(currentInventory);

var expectedFlatList = 'Brunello Cucinelli, tasselled black low-top lace-up, 1000\nBrunello Cucinelli, tasselled green low-top lace-up, 1100\nBrunello Cucinelli, plain beige suede moccasin, 950\nBrunello Cucinelli, plain olive suede moccasin, 1050\nGucci, red leather laced sneakers, 800\nGucci, black leather laced sneakers, 900\n';

assertEqual(actualFlatList, expectedFlatList, "should render flat list of inventory items");

2)DateTime :: createFromFormat + Datetime-> format:

sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;

在PHP 5.x中不起作用...

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { sscanf(microtime(), '0.%6s00 %s', $usec, $sec); $date = date('Y-m-d H:i:s.', $sec) . $usec; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "22372.335910797 ms" // macOS PHP 5.6.30
string(18) "16772.964000702 ms" // Linux PHP 5.4.16
string(18) "10382.229089737 ms" // Linux PHP 7.3.11 (same linux box as above)

3)gettimeofday +日期:

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

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = new DateTime('NOW'); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "45801.825046539 ms" // macOS PHP 5.6.30 (ms not working)
string(18) "21180.155038834 ms" // Linux PHP 5.4.16 (ms not working)
string(18) "11879.796028137 ms" // Linux PHP 7.3.11 (same linux box as above)

4)microtime + number_format + DateTime :: createFromFormat + DateTime-> format:

$time = gettimeofday();
$date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec'];

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $time = gettimeofday(); $date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec']; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "23706.788063049 ms" // macOS PHP 5.6.30
string(18) "14984.534025192 ms" // Linux PHP 5.4.16
string(18) "7799.1390228271 ms" // Linux PHP 7.3.11 (same linux box as above)

5)microtime + sprintf + DateTime :: createFromFormat + DateTime->格式:

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

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "83326.496124268 ms" // macOS PHP 5.6.30
string(18) "61982.603788376 ms" // Linux PHP 5.4.16
string(16) "19107.1870327 ms" // Linux PHP 7.3.11 (same linux box as above)