1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【PHP】microtimeでミリ秒を取得するときの注意点

Last updated at Posted at 2019-01-14

はじめに

  • やりたかったこと
    「20XX-XX-XXXX XX:XX:XX.SSS」みたいに現在日時を取得したかった(ミリ秒の部分は必ず3桁にしたかった)
  • 結果
    なぜか桁数が崩れたりしてた

microtime関数でミリ秒取得する処理

$a = microtime(true);      // 「タイムスタンプ.マイクロ秒数」を取得します。例)1547472200.102094
$array = explode(".", $a); // $array[0] = "1547472200" $array[1] = "102094"
$msec = substr ( $array[1] , 0 , 3 ); //  ミリ秒取得

検索して見つけたコードを見つけてそのまま使ってました。
この場合、戻り値がfloatとなり、小数点以下がマイクロ秒数となります。
あとはsubstrをつかって、小数点以降の3桁を取得すればミリ秒が取得できます。

が・・・

microtime関数の注意点

phpマニュアルちゃんと見れば気づくんですが、
この関数は引数がtrueだとfloat型で返すようになります。

つまり、

$a = microtime(true);      // 「タイムスタンプ.マイクロ秒数」を取得します。例)1547472200.10
$array = explode(".", $a); // $array[0] = "1547472200" $array[1] = "10"

というパターンも起こりえます。
桁数に指定がなければこれでいいですが、
これだとミリ秒を絶対3桁で取得したい場合、substrつかっても3桁にはならないですよね。

きっちり3桁の文字列にして返したい場合は右を0埋めするとか

$a = microtime(true);
$array = explode('.', $a);
$msec = str_pad(substr($array[1],0,3) , 3, "0");

Dateのformatで「v」を指定してあげるとかが考えられます。(PHP7.0以降)

// DateTimeオブジェクト使うやり方
$datetime = new DateTime();
$msec = $datetime->format('v');

※ただし、formatで「v」を指定するとミリ秒が0になります。

最後に

他にもっといい方法があると思いますが、今回はこういう実装をしてました。
そもそもミリ秒をきっちり3桁になるように取得するという処理がよくつかわれるものなのか疑問ですが・・・
みなさんもプログラムを書くときには型に気を付けましょう・・・

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?