使用2个Calendar类实例来获取时差

时间:2015-06-29 15:45:53

标签: java calendar timezone

我正在使用Java中的Calendar库来尝试找出我的应用程序的问题:

我有两个日历实例,departarrive

depart将于芝加哥的 2015年7月15日下午5:35 离开,而arrive将于 7点/ 7点登陆16/15 在德国柏林。

我目前显示旅行时间的代码是:

    Calendar depart = Calendar.getInstance();       
    Calendar arrive = Calendar.getInstance();

    depart.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
    arrive.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));

    depart.set(Calendar.MONTH, 6);
    depart.set(Calendar.DAY_OF_MONTH, 15);
    depart.set(Calendar.HOUR_OF_DAY, 17);
    depart.set(Calendar.MINUTE, 35);

    arrive.set(Calendar.MONTH, 6);
    arrive.set(Calendar.DAY_OF_MONTH, 16);
    arrive.set(Calendar.HOUR_OF_DAY, 9);
    arrive.set(Calendar.MINUTE, 50);

System.out.println("Depart: " + depart.getTime() + "\nArrive: " + 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: Wed Jul 15 17:35:53 CDT 2015 Arrive: Thu Jul 16 02:50:53 CDT 2015 Flight duration: 9 hours 15 minutes

......但我需要结果:

Depart: Wed Jul 15 17:35:53 CDT 2015 Arrive: Thu Jul 16 **09:50:53 Central European Timezone** 2015 Flight duration: 9 hours 15 minutes

我需要更改出发和到达,以便显示当地时间,但仍然报告正确的行程持续时间为9小时15分钟。

2 个答案:

答案 0 :(得分:1)

您正在调用getTime()来获取Date个实例,然后隐含地调用toString() - 这将始终使用系统当地时区。

您想使用SimpleDateFormat,以便您可以控制用于格式化的时区。例如:

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()));

答案 1 :(得分:0)

您可以根据需要使用DateFormat来显示日期:

DateFormat departDF = DateFormat.getDateTimeInstance(
    DateFormat.LONG, DateFormat.LONG, Locale.US
);
departDF.setTimeZone(depart.getTimeZone());
System.out.println(departDF.format(depart.getTime()));
DateFormat arriveDF = DateFormat.getDateTimeInstance(
    //                                change to US if you want them homologated
    //                                it won't change the time zone info or date/time
    DateFormat.LONG, DateFormat.LONG, Locale.GERMANY
);
arriveDF.setTimeZone(arrive.getTimeZone());
System.out.println(arriveDF.format(arrive.getTime()));

<强>输出

July 15, 2015 5:35:43 PM CDT
16. Juli 2015 09:50:43 CEST
相关问题