Java中DateTime对象之间的天数分数

Java中DateTime对象之间的天数分数,java,jodatime,Java,Jodatime,如何找到两个Joda Time DateTime实例之间以天为单位的分数差 Days.Days介于(开始、结束)之间。getDays()给我一个整数,如10/15等。我需要得到的是精确值,如10.15或15.78减去以毫秒为单位的时间,然后除以每天的毫秒数: double diff = (end.getMillis() - start.getMillis()) / 86400000d; 试验 输出 184.55828560185185 184天13小时23分55秒876毫秒 请注意,由于夏令

如何找到两个Joda Time DateTime实例之间以天为单位的分数差


Days.Days介于(开始、结束)之间。getDays()给我一个整数,如10/15等。我需要得到的是精确值,如10.15或15.78减去以毫秒为单位的时间,然后除以每天的毫秒数:

double diff = (end.getMillis() - start.getMillis()) / 86400000d;
试验

输出

184.55828560185185
184天13小时23分55秒876毫秒

请注意,由于夏令时的原因,时间仅为13小时,而不是14小时。

如果使用hours.hoursBetween,您可能会因为四舍五入而错过分钟

试试这个:
(end.getMillis-start.getMillis())/(1000*3600*24)

感谢评论中的输入,我使用以下方法使其精确工作到秒:

double days = Seconds.secondsBetween(start, end).getSeconds()/86400;

要用分数计算天数,请根据精度要求以足够小的单位计算差值,然后在进行转换为天数的除法之前,先转换为
double

    DateTimeZone zone = DateTimeZone.forID("Europe/Copenhagen");
    DateTime date1 = new DateTime(1997, 1, 1, 0, 0, zone);
    DateTime date2 = new DateTime(1997, 3, 29, 12, 0, zone);

    int seconds = Seconds.secondsBetween(date1, date2).getSeconds();
    double days = (double) seconds / (double) TimeUnit.DAYS.toSeconds(1);
    System.out.println("Difference in days is " + days);
此代码段输出:

天数差为87.5天

我们需要提供正确的时区,以考虑夏季时间(DST)之间的转换。在我的示例中,在欧盟,这两天都是一年中的标准时间部分,因此12小时转换为0.5天。如果对于
date2
我选择的日期是在夏季开始后的四月初,情况就不会是这样了。例如:

    DateTime date2 = new DateTime(1997, 4, 1, 12, 0, zone);
日差为90.45833333

由于
int
只能保存这么多秒,因此该代码的工作时间相差约68年。如果你需要更大的时间跨度,考虑使用分钟或小时而不是秒。如果你通过两个相距太远的日期,Joda Time会友好地抛出一个异常,而不是默认给你一个错误的结果


这个答案是在的时候写的,示例日期时间就是从那里取出来的。

使用
Hours.hoursBetween
getHours
,然后除以
24.0
@SotiriosDelimanolis你的想法很好/简单。在日期-时间工作中,这种分数不常用。所以没有这样的功能。请注意,Joda Time提供了三个类以各种方式表示时间跨度:、和。这些类可以在三个半小时内解析和生成标准字符串,如
PT3H30M
。这不是…100%定义良好,这是问题的一部分。如果某些天有闰秒,或者DST发生变化,那么这对分数天的定义意味着什么?
    DateTime date2 = new DateTime(1997, 4, 1, 12, 0, zone);