我正在使用以下代码使用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,
任何人都可以帮助我找到上面代码中所缺少的问题
我正在使用低于
joda-time
的依赖关系。
implementation 'joda-time:joda-time:2.9.9'
PS 已在下面的链接中选中
如果需要更多信息,请告诉我。提前致谢。您的努力将不胜感激。
答案 0 :(得分:3)
Joda时间代码不起作用的原因是,如果不提供PeriodType
对象,则会使用标准的PeriodType。 standard期间类型不仅定义“期间”计算中要包括的年,月和日,而且还定义周。而且您没有显示星期数,在您的情况下为4。如果您写period.getWeeks()
,它将返回4
。
为了使其工作,必须向PeriodType
构造函数提供一个Period
作为第三个参数。如果将period
的声明更改为
Period period = new Period(startDate, endDate, PeriodType.yearMonthDay());
然后它将起作用。然后,期间计算将仅使用年,月和日字段。
...如果您使用的是Java 8或更高版本,则最好迁移到java.time
软件包中可用的新Java Date and Time API。别误会,Joda Time是一个非常不错的日期和时间API。 Java 8的日期和时间API由于其质量而在Joda Time中受到很大影响。它的主要开发人员实际上是同一个人Stephen Colebourne。
但是Joda Time现在处于维护模式,并且在其网站上要求用户迁移到java.time(JSR-310),这是JDK的核心部分,它代替了此项目。
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);
在ThreeTen-Backport项目中,大多数java.time
功能也被反向移植到Java 6和Java 7,该项目也是由Stephen Colebourne领导的。进一步适用于26项目中的早期Android API级别(低于ThreeTenABP)。参见How to use ThreeTenABP。
请注意,Joda Time和Java Date and Time API之间有some differences。特别是Java日期和时间API中的Period
类不太全面。但是,Java日期和时间API中的Period
类提供了满足您要求的功能。
我看到使用java.time
的这段代码实际上与@MaxXFrenzY的相同。这不是因为复制粘贴,而是因为新的Java日期和时间API的设计既明确又简单。
答案 1 :(得分:2)
使用Java 8 time API,使用DateTimeFormatter和LocalDate可以轻松实现结果。
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
....
public void test() {
DateTimeFormatter formatter =
DateTimeFormatter.ofPattern("dd/MM/yyyy").withLocale(Locale.US);
LocalDate startDate = LocalDate.parse("01/09/1995", formatter);
LocalDate endDate = LocalDate.parse("30/11/2018", formatter);
Period period = Period.between(startDate, endDate);
System.out.println(String.format("No Of Years : %d Years, \nNo Of Months : %d Months, \nNo Of Days : %d Days, ",
period.getYears(), period.getMonths(), period.getDays())
);
}
打印结果为:
No Of Years : 23 Years,
No Of Months : 2 Months,
No Of Days : 29 Days,
答案 2 :(得分:-1)
您可以在没有Joda-Time的情况下执行此操作 类型可能使用错误的毫秒数,但看起来像这样
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
Locale.getDefault());
final Date startdate = format.parse("2018-10-20 23:34:32");
final Date enddate = format.parse("2019-09-19 23:34:32");
long n = enddate.getTime() - startdate.getTime();
if (n>0) {
long year, month, day, hour, minute, second;
// year = 365 days
year = (n/31536000000);
if (year != 0)
n = n - (year * 31536000000);
// month = 30 Days
month = (n/2592000000);
if (month != 0)
n = n - (month * 2592000000);
day = (n / 86400000);
if (day != 0)
n = n - (day * 86400000);
hour = (n / 3600000);
if (hour != 0)
n = n - (hour * 3600000);
minute = (n / 60000);
if (minute != 0)
n = n - (minute * 60000);
second = (n / 1000);
}