我正在尝试获取格式化日期,包括毫秒级的微秒。
唯一的问题是我一直得到000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
离。 07-28-2013 11:26:14.000000
答案 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手册页:
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");
上引用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)
该错误最近已得到修复,现在您可以使用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
您需要先指定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
如果您仍在使用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'));
按顺序执行以下操作:
Date()
可以处理日期。DateTime()
可以允许您修改所在的时区,但请确保在使用date_default_timezone_set("Timezone");
函数和类之前设置了DateTime()
。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)
答案 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)