あなたの問題はあなたが物事を間違って見ているということかもしれません。ADate
にはタイムゾーンがありません。これは離散的な瞬間を表し、「協定世界時を反映することを目的としています」。カレンダーと日付フォーマッターは、タイムゾーン情報を取得するものです。CalendarインスタンスとTimeZoneインスタンスを使用した2番目の例は、正常に機能しているように見えます。現在、このコード:
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Japan"));
System.out.println(String.valueOf(calendar.get(Calendar.HOUR)) + ":" + calendar.get(Calendar.MINUTE));
}
レポート:
0:32
それは私には正しいようです。何が悪いと思いますか?
更新:ああ、おそらくあなたは12:32
上記のコードから期待していますか?そのためにCalendar.HOURの代わりにCalendar.HOUR_OF_DAYを使用するか、または時間の計算を行います。Calendar.HOURは、正午と深夜の両方を表すために0を使用します。
更新2:これを理解するための最後の試みです。このコードを試してください:
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("H:mm a Z");
List<TimeZone> zones = Arrays.asList(
TimeZone.getTimeZone("CST"),
TimeZone.getTimeZone("UTC"),
TimeZone.getTimeZone("Asia/Shanghai"),
TimeZone.getTimeZone("Japan"));
for (TimeZone zone : zones) {
calendar.setTimeZone(zone);
format.setTimeZone(zone);
System.out.println(
calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + " "
+ (calendar.get(Calendar.AM_PM) == 0 ? "AM " : "PM ")
+ (calendar.get(Calendar.ZONE_OFFSET) / 1000 / 60 / 60));
System.out.println(format.format(calendar.getTime()));
}
}
「今」を表す単一のCalendarオブジェクトを作成することに注意してください。次に、Calendar.get()メソッドとSimpleDateFormatの両方を使用して、そのカレンダーで表される時間を4つの異なるタイムゾーンで出力し、両方の方法で同じ結果が得られることを示します。現在の出力は次のとおりです。
22:59 PM -6
22:59 PM -0600
4:59 AM 0
4:59 AM +0000
12:59 PM 8
12:59 PM +0800
13:59 PM 9
13:59 PM +0900
If you used Calendar.HOUR instead of Calendar.HOUR_OF_DAY, then you'd see this instead:
10:59 PM -6
22:59 PM -0600
4:59 AM 0
4:59 AM +0000
0:59 PM 8
12:59 PM +0800
1:59 PM 9
13:59 PM +0900
It correctly shows the current times in Central Standard Time (my time zone), UTC, Shanghai time, and Japan time, respectively, along with their time zone offsets. You can see that they all line up and have the correct offsets.