Javaのタイムゾーンを考慮した時間取得について質問です。

以下のコードで取得できるUNIX時間は、どれも等しいです。
---
System.currentTimeMillis();
new Date().getTime();
Calendar.getInstance().getTimeInMillis();
---

ここで取得される時間は、実行環境のOSのタイムゾーンに依存します。
例えば私のWindowsのタイムゾーンは日本ですので、GMT(UTC)に+9時間(=32400000ミリ秒)された値となります。

ではなく、直接「GMT(UTC)の現在時刻をUNIX時間で取得」したり、「引数に指定したタイムゾーンの現在時刻をUNIX時間で取得」するAPIはないのでしょうか?
Apache Commonsなどのメジャーなライブラリでも構いません。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/08/03 12:38:44

ベストアンサー

id:a-kuma3 No.1

回答回数4971ベストアンサー獲得回数2153

ここで取得される時間は、実行環境の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());
id:gfs

なるほど!大きな勘違いをしていました。

私は自分のテストコードで、SimpleDateFormatを利用していたのですが、このクラスのコードを読んでみたところ、this(pattern, Locale.getDefault()); となっており、デフォルトのタイムゾーンを使用しています。つまり日本時間に変更されていました。

これを、System.currentTimeMills(); で取得した時点で、日本時間を取得しているのだと勘違いしていました。

SimpleDateFormatの第2引数にLocaleを渡す必要があったんですね。

とても勉強になりました。

ありがとうございます。

2011/08/03 12:37:37
  • id:gfs
    Localeじゃなかった。SimpleDateFormatへのタイムゾーンのセットですね。
    df.setTimeZone(TimeZone.getTimeZone("UTC"));

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません