如何使用JodaTime以毫秒为单位获得2个日期之间的时差

时间:2011-07-13 15:36:37

标签: java jodatime

我打算设计一个应用程序,我需要在两个日期之间得到确切的时间差。例如:

Date1:31/05/2011 12:54:00
Date2:31/05/2011 13:54:00

我尝试使用getTime(),但我没有得到确切的结果。

上述输入的预期输出为3600000(60 * 60 * 1000)毫秒,但我得到46800000(13 * 60 * 60 * 1000)。

当我浏览不同的java论坛时,人们建议使用JodaTime。

我仍然无法得到确切的结果。

我工作的时区是伦敦(GMT)。

5 个答案:

答案 0 :(得分:7)

初始化两个dateTime并使用Period:

DateTime dt1 = new DateTime(2013,9,11,9,58,56);
DateTime dt2 = new DateTime(2013,9,11,9,58,59);
Period p = new Period(dt1, dt2, PeriodType.millis());

以毫秒为单位获得差异:

System.out.println(p.getValue(0));

答案 1 :(得分:6)

public static long getDiff(Calender cal1, Calender cal2)
{
    return Math.abs(cal1.getTimeInMillis() - cal2.getTimeInMillis());
}

答案 2 :(得分:4)

查看secondsBetween( )

  

创建一个秒,表示之间的整秒数   两个指定的部分日期时间。   这两个部分必须包含相同的字段,例如您可以   指定两个LocalTime对象。

参数:

 start - the start partial date, must not be null
    end - the end partial date, must not be null 

返回:

 the period in seconds 

答案 3 :(得分:3)

JodaTime正在使用机器时间。因此,要查找毫秒,您可以使用常量存储LocalDateTime(参考1970年1月1日)(因为UNIX Time)。

  

Unix时间或POSIX时间是用于描述时间点的系统,   定义为自午夜起来以来经过的秒数   1970年1月1日的协调世界时(UTC),不计算飞跃   秒。然后计算你的DateTime之间的差异。

我试过这样;

public static void main(String[] args) {
        final LocalDateTime JAN_1_1970 = new LocalDateTime(1970, 1, 1, 0, 0);
        DateTime local = new DateTime().withZone(DateTimeZone.forID("Europe/Amsterdam"));
        DateTime utc = new DateTime(DateTimeZone.UTC);

        System.out.println("Europe/Amsterdam milis :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.forID("Europe/Amsterdam")), local).getMillis());
        System.out.println("UTC  milis             :" + new Duration(JAN_1_1970.toDateTime(DateTimeZone.UTC), utc).getMillis());

    }

结果是;

Europe/Amsterdam milis :1429695646528
UTC  milis             :1429692046534

并且@leonbloy写了here一个好的评论。

  

你的本地和utc代表相同的时间瞬间,(只有   附带不同的时区)。因此,getMillis()(给出了   从“瞬间”对应的“物理”时间间隔过去了   unix epoch),必须返回相同的值。

答案 4 :(得分:1)

Joda是一个完美的库,但是如果你需要两个日期之间的差异(毫秒),你应该计算getTime()之间的差异。如果你得到错误的结果,你会遇到时区左右的问题。通常它有效。