Я пытаюсь получить отформатированную дату, включая микросекунды с миллисекундами.
Единственная проблема - я продолжаю получать 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ех. 07-28-2013 11: 26: 14.000000
Я пытаюсь получить отформатированную дату, включая микросекунды с миллисекундами.
Единственная проблема - я продолжаю получать 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ех. 07-28-2013 11: 26: 14.000000
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 мкс).
Еще один пример с php.net:
$d2=new DateTime("2012-07-08 11:14:15.889342");
Ссылка dateTime()
на php.net
Я ответил на вопрос как краткий и упрощенный для автора. Пожалуйста, см. Для получения дополнительной информации для автора: получение формата даты MdY H: i: su от миллисекунд
Вы можете легко сделать это с помощью формата ввода Uu
.
$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
Спасибо Гиггси за то, что он указал на ошибку в моем исходном ответе, добавление 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
Однако описанный здесь метод инициализирует объект DateTime с помощью microtime()
который возвращает количество секунд, прошедших с начала эпохи Unix (01 января 1970 г. 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")
Здесь немного более короткий подход. Вместо того, чтобы создавать высокоточную числовую дату/время, я конвертирую значение микросекунды в строку, удаляю 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
.
Я использую
echo date("Y-m-d H:i:s.").gettimeofday()["usec"];
output: 2017-09-05 17:04:57.555036
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);
пример вывода:
02-06-2019 16:45:03.53811192512512
Если вам нужно ограничить количество десятичных разрядов, то хорошей альтернативой будет строка ниже (credit 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
Если вы хотите отформатировать дату наподобие 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 сделал круглые десятичные знаки, но в обоих случаях они округлили их одинаково.
Вот еще один метод, который я считаю немного более элегантным/простым:
echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));
// 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;
Это основано на ответе от 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");
В документации указано следующее:
Микросекунды (добавлены в PHP 5.2.2). Обратите внимание, что date() всегда будет сгенерируйте 000000, так как он принимает целочисленный параметр, тогда как DateTime:: format() поддерживает микросекунды.
I.e. вместо этого используйте DateTime.
С 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()
.Начиная с PHP 7.1 вы можете просто сделать это:
$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );
Это будет отображаться как:
04-11-2018 10:54:01.321688
если вы используете Carbon, вы можете использовать определенную спецификацию "RFC3339_EXTENDED". или настроить его.
Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';
Основано на ответе @ArchCodeMonkey.
Если вы declare(strict_types=1)
вы должны привести второй аргумент к строке