QA@IT

MySQLのDatetime型のミリ秒を、JavaScript上のDate型のミリ秒に合わせる方法

4745 PV

MySQL上に以下のようなDatetime型のデータが存在します。limit_date_ms は、ミリ秒に変換した値です。

select sample_date,unix_timestamp(sample_date) as sample_date_ms from t_hogehoge;
+---------------------+---------------+
| limit_date          | limit_date_ms |
+---------------------+---------------+
| 2014-10-01 00:00:00 |    1412121600 |
+---------------------+---------------+
1 row in set (0.01 sec)

上記のミリ秒の値をブラウザ側へ取得して、JavaScript上で、Date型の変数を作成しようと試みました。
しかし、このミリ秒をDate型にすると、1970年として認識されてしまいます。
Firebugで実行した結果です。

> new Date(1412121600)
> Date {Sat Jan 17 1970 17:15:21 GMT+0900}

目的は以下の2つです。
1.サーバからブラウザにデータを渡すときに、できればミリ秒で渡したい。
2.ミリ秒の数値から、Date型の変数を生成し、年月日をMySQL上のデータと合わせたい。

既存のソースを出来るだけ変更したくないと思ったのですが、何か良い案は無いでしょうか。

回答

MySQL の UNIX_TIMESTAMP が返す値は 1970-01-01 00:00:00 UTC からの秒数です。ミリ秒ではありません。

it returns the value of the argument as seconds since '1970-01-01 00:00:00' UTC
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

JavaScript の new Date に渡すのはミリ秒なので正しい結果が得られません。

1 January 1970 00:00:00 UTC (Unix Epoch).からのミリ秒数を表す整数値です。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date

なので、SQL か、JS に渡すときか、JS 中で 1000 倍してやる必要があります。
質問文中のコードを変えるなら、下記のいずれかで期待する結果が得られます。

select sample_date,unix_timestamp(sample_date) * 1000 as sample_date_ms from t_hogehoge;
new Date(1412121600 * 1000)
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。