JavaでタイムゾーンをPSTにするスニペット
Javaで時刻をPST(太平洋標準時)に直すスニペットです。
System.currentTimeMills()で現在時刻を取得して、それをGMTやPSTに直したいときってありますよね。たぶん。
例えば、Amazon EC2使って海外のユーザをターゲットにFacebookアプリを使うときとかに必要になるんじゃないでしょうか。
サンプルコード
import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; public class Sample { // PSTに変換 public static long toPST(long time) { TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); long offset = tz.getOffset(time); long pstTime = time + offset; return pstTime; } // テストコード public static void main(String[] args) { long time = System.currentTimeMillis(); //現在時刻 long pstTime = toPST(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String date = sdf.format(new Date(time)); String pstDate = sdf.format(new Date(pstTime)); System.out.printf("%s ←日本の環境で実行してるのでデフォルトはJST%n", date); System.out.printf("%s ←PSTなので -8h%n", pstDate); } }
実行結果
2011/02/15 20:18:44 ←日本の環境で実行してるのでデフォルトはJST
2011/02/15 12:18:44 ←PSTなので -8h
解説
JDK1.4から追加された getOffset(long time)が肝ですね。
「offset」は英語で「差し引き計算する」という意味だってIT用語辞典に書いてました。
引数に 0L を渡してもそうですし、多くの場合 -8時間分のミリ秒が返ると思います。じゃあなんのための引数かというと、夏時間が実施されている場合に調節してくれるそうです。
ワンライナー
上は読みやすいように4行のメソッドにしてますけど、こうすればスッキリですね。
public static long toPST(long time) { return time + TimeZone.getTimeZone("America/Los_Angeles").getOffset(time); }