はじめに
- やりたかったこと
「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桁になるように取得するという処理がよくつかわれるものなのか疑問ですが・・・
みなさんもプログラムを書くときには型に気を付けましょう・・・