Calendar 将日期值从一个时区更改为另一个时区

Calendar 将日期值从一个时区更改为另一个时区,calendar,timezone,java,simpledateformat,Calendar,Timezone,Java,Simpledateformat,我的情况是我有一个日期obj,里面的日期是UTC时间。不过我希望它改成日本时间 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Japan")); calendar.setTime(someExistingDateObj); System.out.println(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) + ":" + calenda

我的情况是我有一个日期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));
现有的DateObj从db映射而来,db值为2013-02-14 03:37:00.733

04:37

时区似乎不起作用了


感谢您的时间……

sdf2和sdf3都是同等初始化的,因此不需要两个

你的问题可能是你看错了东西。
日期
没有时区。它表示时间上的离散时刻,并且是。日历和日期格式化程序是获取时区信息的工具。您的第二个日历和时区实例示例似乎运行良好。现在,这个代码:

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));
}
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()));
    }
}
报告:

0:32
对我来说,这似乎是正确的。你觉得它有什么问题

更新:哦,也许你期待上述代码中的
12:32
?你可能想用,而不是,或者做一些小时的数学。Calendar.HOUR使用0表示中午和午夜

更新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));
}
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.HOUR而不是Calendar.HOUR\u 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、上海时间和日本时间正确显示当前时间及其时区偏移量。您可以看到它们都排成一行,并且具有正确的偏移量。

感谢您的快速回复。在第二种情况下。toString的日期是2013-02-14 03:37:00,但String.valueOf(calendar.get(calendar.HOUR))+“:”+calendar.get(calendar.MINUTE)是4:37,这是不正确的…在第二种情况下,没有给出该日期。试试我的代码来证明它是有效的。你可以核对一下。如果你仍然不相信,试着提供一个答案,有人可以指出你哪里出了问题。你也没有提到你所在的时区。为什么4:37不是你时间3:37的正确输出?谢谢Ryan,很抱歉造成混淆。我在上海,请看我的最新问题…谢谢again@JobSmith
Date.toString()
始终使用系统默认时区。根据您使用的
时区,
日历
应该返回正确的值。您使用的是什么
java.sql.Date
java.util.Date
?我已经检查过它的Utils对象和它的工作状态,即使在
java.sql.Date
的情况下,它也没有任何区别。为我工作很好!你能把你用于
someExistingDateObj
@dShringi的代码贴出来吗谢谢你回复Shringi。请看我与Ryan的讨论