Java日历中的时区问题

时间:2015-06-29 17:42:16

标签: java calendar timezone dst difference

我正在使用两个Calendar实例,并尝试在每个实例之间获取时间(我正在调用实例departarrive)。

以下是我关注的代码段:

public static void main(String[] args)
{
    Calendar departDST = Calendar.getInstance();
    departDST.set(Calendar.YEAR, 2015);
    departDST.set(Calendar.MONTH, 2);
    departDST.set(Calendar.DAY_OF_MONTH, 7);
    departDST.set(Calendar.HOUR_OF_DAY, 17);
    departDST.set(Calendar.MINUTE, 35);

    Calendar arriveDST = Calendar.getInstance();
    arriveDST.set(Calendar.YEAR, 2015);
    arriveDST.set(Calendar.MONTH, 2);
    arriveDST.set(Calendar.DAY_OF_MONTH, 8);
    arriveDST.set(Calendar.HOUR_OF_DAY, 9);
    arriveDST.set(Calendar.MINUTE, 50);

    departDST.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
    arriveDST.setTimeZone(TimeZone.getTimeZone("UTC"));

    printFlightDuration(departDST, arriveDST);
}

public static void printFlightDuration(Calendar depart, Calendar arrive)
{
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm z", Locale.US);

    formatter.setTimeZone(depart.getTimeZone());
    System.out.println("Depart: " + formatter.format(depart.getTime()));

    formatter.setTimeZone(arrive.getTimeZone());
    System.out.println("Arrive: " + formatter.format(arrive.getTime()));

    long hours = (arrive.getTimeInMillis() - depart.getTimeInMillis()) / (1000*60*60);
    long minutes = (arrive.getTimeInMillis() - depart.getTimeInMillis()) / (1000*60) - (hours*60);

    System.out.println("Flight duration: " + hours + " hours" + " " + minutes + " minutes");
}

现在,如果我将depart的日期设置为 2015年7月15日下午5:35 arrive 7/16 / 2015年上午9:50 ,应用程序报告 9小时15分钟的正确时间

如果我将depart的日期设置为 2015年3月7日下午5:35 arrive 3/8/2015 at上午9:50 ,应用程序报告 10小时15分钟 [因为白天节省时间发生在2015年3月8日凌晨2:00]。

我应该如何更改我的应用程序,以便报告9小时15分钟的正确持续时间,无论我将departarrive设置为哪个日期?

  • 我有一个想法是将departarrive转换为UTC,然后计算它们之间的差异,但要么是我错误地实现了解决方案,要么解决方案完全是对问题的错误答案

0 个答案:

没有答案