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);
}