将日期值从一个TimeZone更改为另一个TimeZone

时间:2013-02-14 03:21:36

标签: calendar timezone java simpledateformat

我的情况是我有一个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

似乎时区不起作用?

谢谢你的时间......

2 个答案:

答案 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,上海时间和日本时间的当前时间及其时区偏移。您可以看到它们都排成一行并具有正确的偏移量。