получение формата даты 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 88
php

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.

Я использую

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:').(date('s')+fmod(microtime(true), 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;

если вы хотите отформатировать дату, как 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'));

это делает следующее:

  1. обрезает последние 4 нуля от строки так Date() может обрабатывать дату.
  2. используется дата в формате МС на строку даты типа datetime времени, что можно понять.
  3. DateTime() может затем позволить вам изменить часовой пояс, в котором вы находитесь, но убедитесь, что date_default_timezone_set("Timezone"); устанавливается перед использованием DateTime() функции и занятия.
  4. это хорошая практика, чтобы использовать конструктор в ваших классах, чтобы убедиться, что ваш в правильном часовом поясе, когда 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

Если вы используете углерод, вы можете использовать определенную спецификацию "RFC3339_EXTENDED". или настроить его.

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