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

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

我有两个日历实例, departarrive

20157月15日下午5:35从芝加哥depart于20157月16上午9:50在德国柏林降落。

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

  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分钟。

您正在调用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())); 

您可以使用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