Формат даты получения m-d-Y H: i: s.u от миллисекунд

Я пытаюсь получить отформатированную дату, включая микросекунды с миллисекундами.

Единственная проблема - я продолжаю получать 000000

date("m-d-Y H:i:s.u", $milliseconds/1000);

ех. 07-28-2013 11: 26: 14.000000

Ответ 1

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 от миллисекунд

Ответ 2

Вы можете легко сделать это с помощью формата ввода 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 для форматов даты:

  • U = секунды с начала эпохи Unix
  • и = микросекунды

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")

Ответ 3

Здесь немного более короткий подход. Вместо того, чтобы создавать высокоточную числовую дату/время, я конвертирую значение микросекунды в строку, удаляю 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.

Ответ 4

Я использую

echo date("Y-m-d H:i:s.").gettimeofday()["usec"];

output: 2017-09-05 17:04:57.555036

Ответ 5

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

Ответ 6

Если вы хотите отформатировать дату наподобие 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

Вот еще один метод, который я считаю немного более элегантным/простым:

echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));

Ответ 8

// 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

Это основано на ответе от 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

В документации указано следующее:

Микросекунды (добавлены в PHP 5.2.2). Обратите внимание, что date() всегда будет сгенерируйте 000000, так как он принимает целочисленный параметр, тогда как DateTime:: format() поддерживает микросекунды.

I.e. вместо этого используйте DateTime.

Ответ 11

С 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().

Ответ 12

Начиная с PHP 7.1 вы можете просто сделать это:

$date = new DateTime( "NOW" );
echo $date->format( "m-d-Y H:i:s.u" );

Это будет отображаться как:

04-11-2018 10:54:01.321688

Ответ 13

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

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

Ответ 14

Основано на ответе @ArchCodeMonkey.

Если вы declare(strict_types=1) вы должны привести второй аргумент к строке

enter image description here