【问题标题】:Joda: how to get months and days between two datesJoda:如何在两个日期之间获取月份和日期
【发布时间】:2015-11-09 16:57:25
【问题描述】:

我认为我在这里遗漏了一些微妙之处,因为我正在阅读的所有内容都表明这应该有效。我需要在 Android 中获取两个日期之间的月份和日期。也就是说,有多少整月加上任何额外的天数。我需要它作为数字输出,而不是打印的字符串。这是我正在做的事情,使用 Joda:

void method(DateTime begin, DateTime end) {
    Period period = Period period = new Period(begin, end);
    final int months = period.getMonths();
    final int additionalDays = period.getDays();

问题是additionalDays 始终为零。例如,2015 年 7 月 1 日到 2015 年 11 月 29 日应该是 4 个月零 29 天,但我得到的是 4 个月零 0 天。

【问题讨论】:

    标签: java android jodatime


    【解决方案1】:

    如果不支持,来自documentation Period.getDays() 将返回 0。我不确定为什么不支持,但我想提供一种不同的方法:使用DaysMonths 类及其monthsBetween()daysBetween() 方法。请注意,您还必须减去两者之间的月份:

    // Get months
    int months = Months.monthsBetween(begin, end).getMonths();
    // Subtract this number of months from the end date so we can calculate days
    DateTime newEnd = end.minusMonths(months);
    // Get days
    int days = Days.daysBetween(begin, newEnd).getDays();
    

    如果您在中间不执行此减法,您​​将得到不正确的结果,因为您将得到 所有 天。

    【讨论】:

    • 好主意,但在开头加上月份不是从结尾减去月份更好吗?还是会有同样的结果?我会试试这个,谢谢。
    • 我想他们会有相同的结果。关键是您已经算出了月数,所以您只想知道天数的差异。您可能也想采用绝对值。例如:如果您从 7 月 5 日到 11 月 1 日做了四个月,那么您将比较 7 月 5 日和 7 月 1 日之间的日期,这可能会返回负数。我无法测试它,但也要注意这一点。
    【解决方案2】:

    您使用的Period 构造函数的javadoc

    new Period(begin, end);
    

    状态

    使用标准从给定的间隔端点创建一个周期 一组字段。

    也就是说,它等价于

    Period period = new Period(startTime, endTime, PeriodType.standard());
    

    PeriodType#standard() 方法返回支持周字段的PeriodType

    您的经期,2015 年 7 月 1 日至 2015 年 11 月 29 日,实际上是 4 个月零 28 天,其中 28 天变成了 4 周。所以你的 Period 对象实际上是 4 个月零 4 周。

    如果您尝试在 2015 年 7 月 1 日至 2015 年 11 月 30 日期间创建Period,您将有 4 个月零 4 周零 1 天的时间。

    相反,使用仅支持年、月和日字段的 PeriodType#yearMonthDay() 创建 Period

    period = new Period(begin, end, PeriodType.yearMonthDay());
    

    那么您将有一个 Period 4 个月零 28 天,因为它不支持数周。

    【讨论】:

    • 很好的答案,谢谢。我很高兴我碰巧使用了整周,因为如果几天返回了一些看似随机的数字,那将更加混乱!我已经用 Months 和 Days 实现了它,效果很好,但如果我重新做一遍或有理由重新审视它,我可能会将其更改为这种技术。它似乎更简单一些。
    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多