如何确定 Java 中两个日历对象之间传递的时间?

问题描述 投票:0回答:5

在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;
}
java calendar
5个回答
2
投票
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);

1
投票

对于 Java 中所有与日期相关的内容,我会强烈推荐 Joda Time。它有一个更干净、更直观的 API,以及日期间隔等概念。


0
投票

代码看起来不错,但有一个主要警告:

Calendar
可变

所以,而不是

Calendar start = super.dateOpened;

你应该这样做

Calendar start = (Calendar) super.dateOpened.clone();

否则更改会反映在

dataOpened
中,这可能会导致意外的副作用。


0
投票

我错过了什么吗? Calendar中有一个compareTo(),以及其他有用的东西...

怎么样:

Calendar now = Calendar.getInstance();

now.add(Calendar.MONTH, -PERIOD_IN_MONTHS);

return super.dateOpened.before(now);

从今天减去 X 个月,看看开始日期是否仍在该日期之前。 如果是的话,那么肯定已经过去 X 个月了。


0
投票

java.time

现代的 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() ;
© www.soinside.com 2019 - 2024. All rights reserved.