java - 如何使用 Joda-Time 计算两个日期之间的年数、月数和天数

标签 java android jodatime android-jodatime

我使用以下代码计算两个日期之间的年数、月数和天数,使用 Joda-Time

public void getDateDiff(View view) {

    DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy").withLocale(Locale.US);
    DateTime startDate = null;
    DateTime endDate = null;

    // expected output 23...2....29

    try {
        startDate = formatter.parseDateTime("01/09/1995");
        endDate = formatter.parseDateTime("30/11/2018");

        Period period = new Period(startDate, endDate);

        Log.e("No Of Years : ", period.getYears() + " Years, ");
        Log.e("No Of Months : ", period.getMonths() + " Months, ");
        Log.e("No Of Days : ", period.getDays() + " Days, ");

        tvResult.setText(String.format("No Of Years : %d Years, \nNo Of Months : %d Months, \nNo Of Days : %d Days, ", period.getYears(), period.getMonths(), period.getDays()));

    } catch (Exception e) {
        e.printStackTrace();
    }


}

以上代码的预期输出是(checked using this site 并在 google play 商店中使用一个应用程序)

23 years, 2 months, 29 days

但我使用相同的日期得到的结果低于

/goku.com.demo E/No Of Years :: 23 Years, 
/goku.com.demo E/No Of Months :: 2 Months, 
/goku.com.demo E/No Of Days :: 1 Days, 

谁能帮我找出上面代码中遗漏的问题

I'm using using below joda-time Dependency.

implementation 'joda-time:joda-time:2.9.9'

P.S. 已检查以下链接

如果需要更多信息,请告诉我。提前致谢。我们将不胜感激。

最佳答案

您的 Joda Time 代码不起作用的原因是,如果您不提供 PeriodType 对象,则会使用标准 PeriodType。 standard period 类型不仅定义了要包含在 Period 计算中的年、月和日,还定义了周。而且您没有显示周数,在您的情况下为 4。如果您编写 period.getWeeks(),它将返回 4

为了让它工作,您必须提供一个 PeriodType 作为 Period 构造函数的第三个参数。如果将 period 的声明更改为

Period period = new Period(startDate, endDate, PeriodType.yearMonthDay());

然后就可以了。期间计算将仅使用年、月和日字段。

但是

...最好迁移到 java.time 中可用的新 Java 日期和时间 API包,如果您使用的是 Java 8 或更高版本。不要误会我的意思,Joda Time 是一个非常好的日期和时间 API。 Java 8 的日期和时间 API 因其质量而深受 Joda Time 的影响。它的首席开发人员实际上是同一个人,Stephen Colebourne .

但是 Joda Time 现在处于维护模式,并且在其网站上要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

使用 Java 8 日期和时间 API

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/yyyy").withLocale(Locale.US);

// expected output 23...2....29
LocalDate startDate = LocalDate.parse("01/09/1995", f);
LocalDate endDate = LocalDate.parse("30/11/2018", f);
Period period = Period.between(startDate, endDate);

向后移植到 Java 6 和 7;安卓支持

ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 Java 7项目,也由 Stephen Colebourne 领导。在 26 中进一步适应早期的 Android API 级别(低于 ThreeTenABP)项目。参见 How to use ThreeTenABP .

注意有some differences在 Joda Time 和 Java Date and Time API 之间。特别是,Java 日期和时间 API 中的 Period 类不够全面。但是,Java 日期和时间 API 中的 Period 类提供了满足您要求的功能。


我看到这段使用java.time 的代码实际上与@MaxXFrenzY 的相同。这不是因为复制粘贴,而是因为新的 Java 日期和时间 API 被设计为既明确又直接。

关于java - 如何使用 Joda-Time 计算两个日期之间的年数、月数和天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53552678/

相关文章:

java - 使用 Apache HttpClient 发布 MultipartEntity 时,ByteArrayBody 可以工作,但 InputStreamBody 会抛出 NoHttpResponseException

android - 隐藏键盘的 HTC Softkeyboard 键

java - Joda parseDateTime() 返回 future 日期

java - 时间无关的 JUnit 测试用例

java - 如何获取当年1月1日开始至今的小时数?

java - 尝试安装未签名的远程 .apk 文件时出现不一致的解析错误

java - 如何为用户输入无效添加异常(exception)?用户应输入名称,如果输入不是名称,则需要抛出异常

java - MongoDB 3 Java检查集合是否存在

java - 这段代码 fragment 是什么意思

java - 无法更改 Android 应用程序中的默认字体