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

问题描述 投票:0回答:3

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

我有两个日历实例,

depart
arrive

depart
将于 7/15/2015 下午 5:35 从芝加哥起飞,而
arrive
将于 7/16/15 上午 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 分钟。

java calendar timezone
3个回答
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()));

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

0
投票

我正在使用 Java 中的日历库来尝试找出一个 我的应用程序有问题

您应该使用

java.time
API,当您发布问题时,该 API 已经使用了一年多。

java.time

java.util
日期时间 API 及其相应的解析/格式化类型
SimpleDateFormat
已过时且容易出错。 2014 年 3 月,现代日期时间 API 取代了旧版日期时间 API。从那时起,强烈建议切换到现代日期时间 API
java.time

...2015 年 7 月 15 日下午 5:35 从芝加哥出发,抵达时间为 2015 年 7 月 16 日上午 9:50 降落在德国柏林... ...显示行程持续时间

您可以创建

ZonedDateTime
实例并找到它们之间的
Duration

演示:

class Main {
    public static void main(String[] args) {
        ZonedDateTime depart = ZonedDateTime.of(LocalDateTime.of(2015, 7, 15, 17, 35), ZoneId.of("America/Chicago"));
        ZonedDateTime arrive = ZonedDateTime.of(LocalDateTime.of(2015, 7, 16, 9, 50), ZoneId.of("Europe/Berlin"));
        Duration duration = Duration.between(depart, arrive);
        System.out.println("Depart: " + depart);
        System.out.println("Arrive: " + arrive);
        System.out.printf("Flight duration: %d hours %d minutes%n", duration.toHoursPart(), duration.toMinutesPart());

        // A example of a custom format
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z uuuu", Locale.ENGLISH);
        System.out.println(depart.format(formatter));
    }
}

输出:

Depart: 2015-07-15T17:35-05:00[America/Chicago]
Arrive: 2015-07-16T09:50+02:00[Europe/Berlin]
Flight duration: 9 hours 15 minutes
Wed Jul 15 17:35:00 CDT 2015

在线演示

Trail:日期时间

了解现代日期时间 API
© www.soinside.com 2019 - 2024. All rights reserved.