在java中计算两个日历日期之间的时间量的最佳方法是什么?我正在编写一个方法,该方法确定两个日期之间经过的月数,并根据预定义的月份返回一个布尔值。这是我的代码(无法正常工作)。
此代码始终返回 false。此外,此代码不考虑过去的天数。如果开始日期是在月底,这可能会出现问题。没有一个简单的compareTo方法吗?
private boolean hasMatured()
{
Calendar now = Calendar.getInstance();
Calendar start = (Calendar) super.dateOpened.clone();
int nowYear = now.get(Calendar.YEAR);
int nowMonth = now.get(Calendar.MONTH);
int startYear = start.get(Calendar.YEAR);
int startMonth = start.get(Calendar.MONTH);
int monthsElapsed = (nowYear - startYear) * 12 + (nowMonth - startMonth);
return monthsElapsed>PERIOD_IN_MONTHS;
}
int nowYear = now.get(Calendar.YEAR);
int nowMonth = now.get(Calendar.MONTH);
int startYear = now.get(Calendar.YEAR);
int startMonth = now.get(Calendar.MONTH);
int monthsElapsed = (nowYear - startYear) * 12 + (nowMonth - startMonth);
对于 Java 中所有与日期相关的内容,我会强烈推荐 Joda Time。它有一个更干净、更直观的 API,以及日期间隔等概念。
代码看起来不错,但有一个主要警告:
Calendar
是可变。
所以,而不是
Calendar start = super.dateOpened;
你应该这样做
Calendar start = (Calendar) super.dateOpened.clone();
否则更改会反映在
dataOpened
中,这可能会导致意外的副作用。
我错过了什么吗? Calendar中有一个compareTo(),以及其他有用的东西...
怎么样:
Calendar now = Calendar.getInstance();
now.add(Calendar.MONTH, -PERIOD_IN_MONTHS);
return super.dateOpened.before(now);
从今天减去 X 个月,看看开始日期是否仍在该日期之前。 如果是的话,那么肯定已经过去 X 个月了。
现代的 java.time 类已经取代了有严重缺陷的遗留类,例如
Calendar
。
你说:
在java中计算两个日历日期之间的时间量的最佳方法是什么。
如果提供两个
Calendar
对象,请在 java.time 中转换为它们的现代替代品。如果具体类是GregorianCalendar
,则转换为ZonedDateTime
。
伪造一些输入。
Calendar cal1 = Calendar.getInstance( );
Calendar cal2 = GregorianCalendar.from( ZonedDateTime.now( ).plusMonths( 3 ).plusDays( 27 ) );
验证底层类型后进行转换。
ZonedDateTime start = null, end = null;
if ( cal1 instanceof GregorianCalendar gc1 ) start = gc1.toZonedDateTime( );
if ( cal2 instanceof GregorianCalendar gc2 ) end = gc2.toZonedDateTime( );
你说:
两个日期之间经过的月数
Period
类。
要制作
Period
,请从每个 LocalDate
中提取
ZonedDateTime
。我们只需要日期部分,不需要一天中的时间或区域。
Period period = Period.between( start.toLocalDate( ) , end.toLocalDate( ) );
period.toString(): P3M27D
如果您只想要月份数,请询问。
int months = period.getMonths() ;