73

このコードは、PHP5.2.5ではマイクロ秒の間常に0を返します。

<?php
$dt = new DateTime();
echo $dt->format("Y-m-d\TH:i:s.u") . "\n";
?>

出力:

[root@www1 ~]$ php date_test.php
2008-10-03T20:31:26.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:27.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:27.000000
[root@www1 ~]$ php date_test.php
2008-10-03T20:31:28.000000

何か案は?

4

18 に答える 18

27

これは機能しているようですが、 http: //us.php.net/dateがマイクロ秒指定子を文書化しているのに実際にはサポートしていないのは非論理的です。

function getTimestamp()
{
        return date("Y-m-d\TH:i:s") . substr((string)microtime(), 1, 8);
}
于 2008-10-04T00:57:22.487 に答える
19

DateTimeオブジェクトを構築するときに入力にマイクロ秒が含まれるように指定し、入力microtime(true)として直接使用できます。

.残念ながら、正確な秒に到達すると、マイクロタイム出力に何もないため、これは失敗します。sprintfその場合、強制的に a を含めるために使用します.0

date_create_from_format(
    'U.u', sprintf('%.f', microtime(true))
)->format('Y-m-d\TH:i:s.uO');

または同等(よりオブジェクト指向スタイル)

DateTime::createFromFormat(
    'U.u', sprintf('%.f', microtime(true))
)->format('Y-m-d\TH:i:s.uO');
于 2011-07-07T01:19:09.703 に答える
17

この関数はhttp://us3.php.net/dateから取得されました

function udate($format, $utimestamp = null)
{
    if (is_null($utimestamp))
        $utimestamp = microtime(true);

    $timestamp = floor($utimestamp);
    $milliseconds = round(($utimestamp - $timestamp) * 1000000);

    return date(preg_replace('`(?<!\\\\)u`', $milliseconds, $format), $timestamp);
}

echo udate('H:i:s.u'); // 19:40:56.78128

「u」を機能させるには、この関数を実装する必要があります...:\

于 2008-10-04T01:31:09.000 に答える
15

これを試すと、マイクロ秒が表示されます。

$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");
于 2010-12-10T22:59:16.273 に答える
8
\DateTime::createFromFormat('U.u', microtime(true));

(少なくともほとんどのシステムでは)次のようになります。

object(DateTime)(
  'date' => '2015-03-09 17:27:39.456200',
  'timezone_type' => 3,
  'timezone' => 'Australia/Darwin'
)

ただし、PHP の float の丸めにより、精度が失われます。それは本当にマイクロ秒ではありません。

アップデート

これはおそらくcreateFromFormat()オプションの最善の妥協点であり、完全な精度を提供します。

\DateTime::createFromFormat('0.u00 U', microtime());

gettimeofday()

より明示的で、おそらくより堅牢です。Xavi によって発見されたバグを解決します。

$time = gettimeofday(); 
\DateTime::createFromFormat('U.u', sprintf('%d.%06d', $time['sec'], $time['usec']));
于 2015-03-09T07:59:53.150 に答える
5

そうですね、これは一度クリアしてみたいと思います。

PHPでISO8601形式の日付と時刻をミリ秒とマイクロ秒で表示する方法の説明...

ミリ秒または 'ms' の小数点以下は 4 桁です (例: 0.1234)。マイクロ秒または 'µs' は小数点以下 7 桁です。秒の分数/名前の説明はこちら

PHP の関数は、ミリ秒またはマイクロ秒で完全に期待どおりに動作するわけではありません。これは、 php 日付ドキュメントの書式文字「u」でdate()説明されているように、整数を除くだけであるためです。

Lucky のコメントのアイデア ( here ) に基づいていますが、PHP 構文が修正され、秒の書式設定が適切に処理されています (Lucky のコードでは、秒の後に誤った余分な '0' が追加されていました)。

これらはまた、競合状態を排除し、秒を正しくフォーマットします。

ミリ秒の PHP 日付

同等の作業date('Y-m-d H:i:s').".$milliseconds";

list($sec, $usec) = explode('.', microtime(true));
echo date('Y-m-d H:i:s.', $sec) . $usec;

出力 =2016-07-12 16:27:08.5675

マイクロ秒の PHP 日付

同等の機能date('Y-m-d H:i:s').".$microseconds";またはdate('Y-m-d H:i:s.u')日付関数がマイクロ秒/ microtime()/'u'で期待どおりに動作した場合

list($usec, $sec) = explode(' ', microtime());
echo date('Y-m-d H:i:s', $sec) . substr($usec, 1);

出力 =2016-07-12 16:27:08.56752900

于 2016-07-12T16:19:13.567 に答える
4

これは私にとってはうまくいき、単純な 3 ライナーです。

function udate($format='Y-m-d H:i:s.', $microtime=NULL) {
    if(NULL === $microtime) $microtime = microtime();
    list($microseconds,$unix_time) = explode(' ', $microtime);
    return date($format,$unix_time) . array_pop(explode('.',$microseconds));
}

これは、デフォルトで (パラメーターが指定されていない)、呼び出された現在のマイクロ秒に対して次の形式の文字列を返します。

YYYY-MM-DD HH:MM:SS.UUUUUUUU

さらに単純で高速なもの (ただし、精度は半分しかありません) は次のようになります。

function udate($format='Y-m-d H:i:s.', $microtime=NULL) {
    if(NULL === $microtime) $microtime = microtime(true);
    list($unix_time,$microseconds) = explode('.', $microtime);
    return date($format,$unix_time) . $microseconds;
}

これは、次の形式で出力されます。

YYYY-MM-DD HH:MM:SS.UUUU

于 2013-06-04T16:22:05.757 に答える
1

これはどう?

$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>";

サンプル出力

2013-07-17 08:23:37:0.88862400

于 2013-07-17T08:39:51.450 に答える
1

Luckyのコメントと PHP バグ データベースのこの機能リクエストに基づいて次のようなものを使用します。

class ExtendedDateTime extends DateTime {
    /**
     * Returns new DateTime object.  Adds microtime for "now" dates
     * @param string $sTime
     * @param DateTimeZone $oTimeZone 
     */
    public function __construct($sTime = 'now', DateTimeZone $oTimeZone = NULL) {
        // check that constructor is called as current date/time
        if (strtotime($sTime) == time()) {
            $aMicrotime = explode(' ', microtime());
            $sTime = date('Y-m-d H:i:s.' . $aMicrotime[0] * 1000000, $aMicrotime[1]);
        }

        // DateTime throws an Exception with a null TimeZone
        if ($oTimeZone instanceof DateTimeZone) {
            parent::__construct($sTime, $oTimeZone);
        } else {
            parent::__construct($sTime);
        }
    }
}

$oDate = new ExtendedDateTime();
echo $oDate->format('Y-m-d G:i:s.u');

出力:

2010-12-01 18:12:10.146625
于 2010-12-01T22:29:52.663 に答える
1

date_create

time: strtotime() で受け入れられる形式の文字列で、デフォルトは "now" です。

strtotime

time: GNU » Date Input Formats 構文に従って解析する文字列。PHP 5.0.0 より前では、時間にマイクロ秒を使用することは許可されていませんでした。PHP 5.0.0 以降では許可されていますが無視されています。

于 2008-10-04T05:28:32.347 に答える
0

私が書いているアプリケーションの中で、DateTime オブジェクトにマイクロタイムを設定/表示する必要があります。DateTime オブジェクトにマイクロ秒を認識させる唯一の方法は、「YYYY-MM-DD HH:MM:SS.uuuuuu」の形式で時刻を初期化することです。日付部分と時刻部分の間のスペースは、ISO8601 形式で通常行われている「T」にすることもできます。

次の関数は、ローカル タイムゾーンに初期化された DateTime オブジェクトを返します (コードはもちろん、個々のニーズに合わせて必要に応じて変更できます)。

// Return DateTime object including microtime for "now"
function dto_now()
{
    list($usec, $sec) = explode(' ', microtime());
    $usec = substr($usec, 2, 6);
    $datetime_now = date('Y-m-d H:i:s\.', $sec).$usec;
    return new DateTime($datetime_now, new DateTimeZone(date_default_timezone_get()));
}
于 2013-05-09T18:45:55.627 に答える
0

strtotime() で受け入れられる形式の文字列

于 2008-12-14T20:34:06.483 に答える
0

Lucky のコメントに基づいて、サーバーにメッセージを保存する簡単な方法を書きました。以前はハッシュとインクリメントを使用して一意のファイル名を取得していましたが、このアプリケーションではマイクロ秒の日付がうまく機能します。

// Create a unique message ID using the time and microseconds
    list($usec, $sec) = explode(" ", microtime());
    $messageID = date("Y-m-d H:i:s ", $sec) . substr($usec, 2, 8);
    $fname = "./Messages/$messageID";

    $fp = fopen($fname, 'w');

出力ファイルの名前は次のとおりです。

2015-05-07 12:03:17 65468400
于 2015-05-07T19:07:26.940 に答える
0

一部の回答では、概念的に間違っているいくつかのタイムスタンプを使用しており、重複する問題が発生する可能性が21:15:05.999あり21:15:06.000ます21:15:05.000

どうやら最も簡単なのはDateTime::createFromFormat()withを使用することですU.u、コメントに記載されているように、マイクロ秒がない場合は失敗します。

だから、私はこのコードを提案しています:

function udate($format, $time = null) {

    if (!$time) {
        $time = microtime(true);
    }

    // Avoid missing dot on full seconds: (string)42 and (string)42.000000 give '42'
    $time = number_format($time, 6, '.', '');

    return DateTime::createFromFormat('U.u', $time)->format($format);
}
于 2015-09-13T18:20:08.417 に答える
-1

この方法は、受け入れられた回答よりも安全です。

date('Y-m-d H:i:s.') . str_pad(substr((float)microtime(), 2), 6, '0', STR_PAD_LEFT)

出力:

2012-06-01 12:00:13.036613

更新: 非推奨(コメントを参照)

于 2012-06-04T11:39:35.493 に答える
-2

date('u') は、PHP 5.2 以降でのみサポートされています。PHP が古い可能性があります。

于 2010-11-17T09:29:43.117 に答える