以下のコードで取得できるUNIX時間は、どれも等しいです。
---
System.currentTimeMillis();
new Date().getTime();
Calendar.getInstance().getTimeInMillis();
---
ここで取得される時間は、実行環境のOSのタイムゾーンに依存します。
例えば私のWindowsのタイムゾーンは日本ですので、GMT(UTC)に+9時間(=32400000ミリ秒)された値となります。
ではなく、直接「GMT(UTC)の現在時刻をUNIX時間で取得」したり、「引数に指定したタイムゾーンの現在時刻をUNIX時間で取得」するAPIはないのでしょうか?
Apache Commonsなどのメジャーなライブラリでも構いません。
よろしくお願いいたします。
ここで取得される時間は、実行環境のOSのタイムゾーンに依存します。
これは、どこから得た情報ですか?
まず、これが間違ってます。
質問に挙げられた API が返す値は、いずれも UTC での 1970年1月1日 0時0分からの通算ミリ秒です。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/System.html#currentTimeMillis%28%29
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Date.html#getTime%28%29
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Calendar.html#getTimeInMillis%28%29
ロケールに応じた時刻に変換できるのは、タイムゾーンを表すクラスがあって、
それが UTC との時刻の差を持っているからです。
この辺りは、unix と考え方は同じです。
「引数に指定したタイムゾーンの現在時刻をUNIX時間で取得」するAPI
直接のAPI はありませんが、特定のタイムゾーンと UTC との差を取得できる API はあります。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/TimeZone.html#getRawOffset%28%29
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
System.out.println(c.getTimeZone().getRawOffset());
なるほど!大きな勘違いをしていました。
私は自分のテストコードで、SimpleDateFormatを利用していたのですが、このクラスのコードを読んでみたところ、this(pattern, Locale.getDefault()); となっており、デフォルトのタイムゾーンを使用しています。つまり日本時間に変更されていました。
これを、System.currentTimeMills(); で取得した時点で、日本時間を取得しているのだと勘違いしていました。
SimpleDateFormatの第2引数にLocaleを渡す必要があったんですね。
とても勉強になりました。
ありがとうございます。