получение формата даты m-d-Y H:i:s.u от миллисекунд
Я пытаюсь получить форматированную дату, включая микросекунд до миллисекунд.
единственная проблема в том, что я продолжаю получать 000000
date("m-d-Y H:i:s.u", $milliseconds/1000);
ex. 07-28-2013 11:26:14.000000
13 ответов:
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()
on php.netя ответил на вопрос, как кратко и упростить автору. Пожалуйста, смотрите дополнительную информацию для автора: получение формата даты m-d-Y H:i:s.u от миллисекунд
вы можете легко сделать это с помощью входного формата
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 для форматов дат:
- у = количество секунд с начала эпохи Unix
- u = микросекунды
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
примечание о часовых поясах в ответ на Дэйва.
обычно
createFromFormat()
метод использует местный часовой пояс, если не указанный.http://php.net/manual/en/datetime.createfromformat.php
однако описанный здесь метод инициализации объекта DateTime с помощью
microtime()
который возвращает количество секунд, прошедших с эпохи Unix (01 Jan 1970 00:00: 00 GMT).http://php.net/manual/en/function.microtime.php
это означает, что объект DateTime неявно инициализируется в UTC, что отлично подходит для внутренние задачи сервера, которые просто хотят отслеживать прошедшее время.
Если вам нужно показать время для конкретного часового пояса, то вам нужно установить его соответствующим образом. Однако, это должно быть сделано как отдельный шаг после инициализации (не используя третий параметр
createFromFormat()
) по причинам, рассмотренным выше.The
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
.
// 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;
если вы хотите отформатировать дату, как 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 сделал вокруг десятичных знаков, но он округлил их одинаково в обоих случаях.
это основано на ответе от 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");
вот еще один метод, который я нахожу немного более элегантным / простым:
echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));
в документации говорится следующее:
микросекунды (добавлено в PHP 5.2.2). Обратите внимание, что date () будет всегда сгенерируйте 000000, так как он принимает целочисленный параметр, тогда как DateTime:: format() поддерживает микросекунды.
т. е. вместо этого используйте 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'));
это делает следующее:
- обрезает последние 4 нуля от строки так
Date()
может обрабатывать дату.- используется дата в формате МС на строку даты типа datetime времени, что можно понять.
DateTime()
может затем позволить вам изменить часовой пояс, в котором вы находитесь, но убедитесь, чтоdate_default_timezone_set("Timezone");
устанавливается перед использованиемDateTime()
функции и занятия.- это хорошая практика, чтобы использовать конструктор в ваших классах, чтобы убедиться, что ваш в правильном часовом поясе, когда
DateTime()
используются классы или функции.