我的情况是我有一个Date obj,里面的日期是UTC时间。不过我希望它改成日本时间。
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Japan"));
calendar.setTime(someExistingDateObj);
System.out.println(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + ":" + calendar.get(Calendar.MINUTE));
existingDateObj是从db映射的,db值是2013-02-14 03:37:00.733
04:37
似乎时区不起作用?
谢谢你的时间......答案 0 :(得分:0)
sdf2和sdf3同样初始化,因此不需要其中两个。
答案 1 :(得分:0)
你的问题可能是你看错了。 Date
没有时区。它代表一个离散的时刻,是"intended to reflect coordinated universal time"。日历和日期格式化程序是获取时区信息的原因。使用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,上海时间和日本时间的当前时间及其时区偏移。您可以看到它们都排成一行并具有正确的偏移量。