UTCのタイムスタンプがあり、TimeZone.getTimeZone("PST")
などのAPI呼び出しを使用せずにローカル時間に変換したい。これをどのくらい正確に行う予定ですか?私は次のコードを使用していますが、あまり成功していません。
private static final SimpleDateFormat mSegmentStartTimeFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
}
catch (ParseException e) {
e.printStackTrace();
}
return calendar.getTimeInMillis();
サンプル入力値:[2012-08-15T22:56:02.038Z]
[2012-08-15T15:56:02.038Z]
と同等のものを返す必要があります
Date
にはタイムゾーンがなく、内部的にUTCで保存されます。日付がフォーマットされている場合のみ、タイムゾーンの修正が適用されます。 DateFormat
を使用する場合、デフォルトでは実行中のJVMのタイムゾーンになります。必要に応じてsetTimeZone
を使用して変更します。
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(pstFormat.format(date));
これは2012-08-15T15:56:02.038
を出力します
UTCを示すため、PST形式の'Z'
を省いたことに注意してください。 Z
を使用した場合、出力は2012-08-15T15:56:02.038-0700
になります
最新のJava日時APIを使用すると、これは簡単です。
String inputValue = "2012-08-15T22:56:02.038Z";
Instant timestamp = Instant.parse(inputValue);
ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
System.out.println(losAngelesTime);
これは印刷します
2012-08-15T15:56:02.038-07:00[America/Los_Angeles]
注意点:
Z
は、Zulu時間とも呼ばれるUTCを意味します。したがって、ローカル時間の値では、Z
は存在しないはずです。オフセットはZではなく-7時間になっているため、たとえば2012-08-15T15:56:02.038-07:00
のような戻り値が必要になります。Instant
オブジェクトとして最も適切に処理されます。プレゼンテーションなど、必要な場合にのみZonedDateTime
に変換します。質問:Javaバージョンで最新のAPIを使用できますか?
少なくともJava6を使用している場合、可能です。