使用 2 个 Calendar class 实例获取时差
Using 2 Calendar class instances to get time difference
我正在 Java 中使用日历库来尝试找出我的应用程序的问题:
我有两个日历实例,depart
和 arrive
。
depart
将于 7/15/2015 下午 5:35 从芝加哥出发,而 arrive
将在 着陆德国柏林,2015 年 7 月 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
s 显示您的日期:
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
我正在 Java 中使用日历库来尝试找出我的应用程序的问题:
我有两个日历实例,depart
和 arrive
。
depart
将于 7/15/2015 下午 5:35 从芝加哥出发,而 arrive
将在 着陆德国柏林,2015 年 7 月 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
s 显示您的日期:
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