Я пытаюсь получить отформатированную дату, включая микросекунды с миллисекунд.
Единственная проблема – я продолжаю получать 000000
date("mdY H:i:su", $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("Ymd 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('Ymd H:i:s.'.$micro, $t) ); print $d->format("Ymd H:i:su"); // note at point on "u"
Примечание u
– микросекунды (1 секунда = 1000000 мкс).
Еще пример:
$ d2 = новый DateTime ("2012-07-08 11: 14: 15.889342");
Ссылка dateTime()
на php.net: http://php.net/manual/en/datetime.construct.php
Я ответил на вопрос как короткий и упростил автора. Пожалуйста, смотрите дополнительную информацию автору: формат даты получения mdY H: i: su от миллисекунд
Вы можете легко сделать это с использованием формата ввода Uu
.
$now = DateTime::createFromFormat('U.u', microtime(true)); echo $now->format("mdY H:i:su");
Это дает следующий результат:
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
Однако описанная здесь методика инициализирует объект DateTime с помощью microtime()
который возвращает количество секунд, прошедших со времен Unix Epoch (01 января 1970 года 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("mdY H:i:su") . '<br>'; $local = $now->setTimeZone(new DateTimeZone('Australia/Canberra')); echo $local->format("mdY H:i:su") . '<br>';
Производит следующий вывод:
10-29-2015 00:40:09.433818 10-29-2015 11:40:09.433818
Вот несколько более короткий подход. Вместо того, чтобы работать для создания высокоточной числовой даты / времени, я конвертирую значение микросекунды в строку, удаляю 0
и добавляю ее в конец строки даты / времени. Я могу легко обрезать число десятичных знаков, отрегулировав параметр длины строки; здесь я использую 4
чтобы получить миллисекунды, но вы можете использовать 7
для получения микросекунд.
$t = explode(" ",microtime()); echo date("mdy H:i:s",$t[1]).substr((string)$t[0],1,4);
Для значения microtime () 0.98236000 1407400573
это возвращается 08-07-14 01:08:13.982
.
Будь проще
echo date('mdY H:i:').(date('s')+fmod(microtime(true), 1));
Я использую
echo date("Ymd H:i:s.").gettimeofday()["usec"]; output: 2017-09-05 17:04:57.555036
// Procedural $fineStamp = date('Ymd\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('Ymd\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("mdY H:i:su");
В документации говорится следующее:
Микросекунды (добавлены в PHP 5.2.2). Обратите внимание, что date () всегда генерирует 000000, так как принимает целочисленный параметр, тогда как DateTime :: format () поддерживает микросекунды.
Т.е. вместо этого используйте DateTime.
Если вы хотите отформатировать дату, например JavaScript (new Date()).toISOString()
по какой-то причине, так вы можете это сделать в PHP:
$now = microtime(true); gmdate('Ymd\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 сделал круглые десятичные знаки, но в обоих случаях они округлили их одинаково.