你的问题可能是你看错了。ADate
没有时区。它代表一个离散的时刻,“旨在反映协调的世界时间”。日历和日期格式化程序是获取时区信息的内容。您使用 Calendar 和 TimeZone 实例的第二个示例似乎工作正常。现在,这段代码:
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_OF_DAY而不是Calendar.HOUR,或者做一些小时数学。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 打印出该日历在四个不同时区表示的时间,以表明两种方式都获得了相同的结果。现在的输出是:
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
如果您使用 Calendar.HOUR 而不是 Calendar.HOUR_OF_DAY,那么您会看到:
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
它分别以中央标准时间(我的时区)、UTC、上海时间和日本时间正确显示当前时间,以及它们的时区偏移量。您可以看到它们都排成一行并具有正确的偏移量。