よっしー
こんにちは。よっしーです(^^)
今日は、PHPでミリ秒を含むUNIXタイムスタンプとDateTime型の相互変換する方法についてご紹介します。
背景
PHPでミリ秒を含むUNIXタイムスタンプとDateTime型の相互変換するときの内容を備忘として残しています。
ミリ秒を含むUNIXタイムスタンプとは
UNIXタイムスタンプは、1970年1月1日午前0時(UTC)からの経過秒数を表すもので、多くのプログラムやシステムで使用されています。ミリ秒を含むUNIXタイムスタンプは、通常のUNIXタイムスタンプにミリ秒を追加したものです。
例えば、以下のような13桁のUNIXタイムスタンプ(エポックミリ秒)があるとします:1625566674036。これを対応する日付データに変換する方法をいくつか共有します。
- Bash/Linuxを使用する方法:
- まず、ミリ秒を表現するためにドットを挿入します。左から10文字目にドットを挿入する場合は、次のコマンドを実行します:
$ echo 1625566674036 | sed -e 's/^\\ (.\\ {10\\}\\)/\\1./' | awk ' {print strftime (\"%c\",$1)}'
- 出力結果は以下のようになります:
Tue Jul 6 19:17:54 2021
- まず、ミリ秒を表現するためにドットを挿入します。左から10文字目にドットを挿入する場合は、次のコマンドを実行します:
- **C++**を使用する方法:
- ミリ秒単位の時間をC/POSIX timespecに変換する場合、ナノ秒で設定します。ミリ秒の数に100万を掛けるか、または
std::chrono::milliseconds
からstd::chrono::nanoseconds
へ変換します。
- ミリ秒単位の時間をC/POSIX timespecに変換する場合、ナノ秒で設定します。ミリ秒の数に100万を掛けるか、または
以上の方法で、ミリ秒を含むUNIXタイムスタンプを日付データに変換できます。
PHPによる変換例
<?php
$dt = new DateTime('2024/02/18 00:00:00.000');
echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
$timestamp = $dt->format('U.v');
echo $timestamp . PHP_EOL;
$dt = DateTime::createFromFormat('U.v', (string)$timestamp);
echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
$dt = new DateTime("@$timestamp");
echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
解説
前述のコードの各部分について説明します。
- DateTime オブジェクトの生成とフォーマット:
$dt = new DateTime('2024/02/18 00:00:00.000'); echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
- この部分では、
DateTime
クラスを使用して日付と時刻を表すオブジェクトを作成しています。 new DateTime('2024/02/18 00:00:00.000')
は、指定された日付と時刻を表すDateTime
オブジェクトを生成しています。ここでは、2024年2月18日午前0時0分0秒(ミリ秒は0)を表しています。format('Y-m-d H:i:s.v')
は、DateTime
オブジェクトのフォーマットを指定しています。Y
は年、m
は月、d
は日、H
は時、i
は分、s
は秒、v
はミリ秒を表します。このコードは、指定された日付と時刻を「2024-02-18 00:00:00.000」という形式で出力します。
- この部分では、
- UNIXタイムスタンプの生成:
$timestamp = $dt->format('U.v'); echo $timestamp . PHP_EOL;
- この部分では、先ほど作成した
DateTime
オブジェクトからUNIXタイムスタンプを生成しています。 format('U.v')
は、UNIXタイムスタンプを秒単位で取得し、その後にミリ秒を追加しています。例えば、1625566674036
のような値が得られます。
- この部分では、先ほど作成した
- UNIXタイムスタンプからDateTimeオブジェクトを再生成:
$dt = DateTime::createFromFormat('U.v', (string)$timestamp); echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
- この部分では、UNIXタイムスタンプから再び
DateTime
オブジェクトを生成しています。 createFromFormat('U.v', (string)$timestamp)
は、UNIXタイムスタンプを元にDateTime
オブジェクトを再作成しています。再生成されたオブジェクトは、元の日付と時刻を保持しています。
- この部分では、UNIXタイムスタンプから再び
- UNIXタイムスタンプから直接DateTimeオブジェクトを生成:
$dt = new DateTime("@$timestamp"); echo $dt->format('Y-m-d H:i:s.v') . PHP_EOL;
- この部分では、UNIXタイムスタンプから直接
DateTime
オブジェクトを生成しています。@
記号を使用してUNIXタイムスタンプを指定しています。
- この部分では、UNIXタイムスタンプから直接
以上のコードは、日付と時刻の操作、UNIXタイムスタンプの生成、再生成についての基本的な例です。 .
おわりに
今日は、ミリ秒を含むPHPでUNIXタイムスタンプとDateTime型の相互変換する方法についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント