JodaTime - 两个日期之间每个月的天数

时间:2015-06-03 20:10:21

标签: java date datetime jodatime

我有两个这样的日期:

DateTime startingDate = new DateTime(STARTING_YEAR, STARTING_MONTH, STARTING_DAY, 0, 0);
DateTime endingDate = new DateTime(ENDING_YEAR, ENDING_MONTH, ENDING_DAY, 0, 0);

TOTAL_DAYS = Days.daysBetween(startingDate, endingDate).getDays();

很容易知道它们之间的总天数,但我对API并不熟悉,并且想知道是否有更简单的方法来查找2个日期之间每个月没有循环的天数和IFS。

示例:

DateTime startingDate = new DateTime(2000, 1, 1, 0, 0);
DateTime endingDate = new DateTime(2000, 2, 3, 0, 0);

1月31日,2月2日。

谢谢!

4 个答案:

答案 0 :(得分:0)

我最后用循环做了。

DateTime startingDate = new DateTime(STARTING_YEAR, STARTING_MONTH, STARTING_DAY, 0, 0);
DateTime endingDate = new DateTime(ENDING_YEAR, ENDING_MONTH, ENDING_DAY, 0, 0);
TOTAL_DAYS = Days.daysBetween(startingDate, endingDate).getDays();

DateTime currentDate = startingDate;

System.out.println(currentDate.dayOfMonth().getMaximumValue() - currentDate.dayOfMonth().get() + 1);
currentDate = currentDate.plus(Period.months(1));

while (currentDate.isBefore(endingDate)) { 
     System.out.println(currentDate.dayOfMonth().getMaximumValue());
     currentDate = currentDate.plus(Period.months(1));
 }  
System.out.println(endingDate.dayOfMonth().get());

答案 1 :(得分:0)

double days =(endingDate.getMillis() - startingDate.getMillis())/ 86400000.0;

将天数作为浮点数。如果您只想要整天的数量,请截断。

答案 2 :(得分:0)

这可能有所帮助:

DateTime startingDate = new DateTime(2000, 1, 1, 0, 0);
DateTime endingDate = new DateTime(2000, 2, 3, 0, 0);

Duration duration = new Duration(startingDate, endingDate);

System.out.println(duration.getStandardDays());//get the difference in number of days

答案 3 :(得分:0)

仅供参考,Joda-Time项目现在位于maintenance mode,建议迁移到java.time。

java.time

如果您想单独处理每个中间月份,则需要进行迭代。但YearMonth课程略微简化了这项工作。此外,您可以使用Streams屏蔽迭代。

半开

java.time类明智地使用半开放方法来定义时间跨度。这意味着开头是包含,而结尾是独占。因此,一个月的范围需要以跟随结束目标月份结束。

TemporalAdjuster

TemporalAdjuster接口提供了对日期时间值的操作。 TemporalAdjusters类(注意复数s)提供了几个方便的实现。我们需要:

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate startDate = LocalDate.of( 2000 , 1 , 1 );
YearMonth ymStart = YearMonth.from( startDate );

LocalDate stopDate = LocalDate.of( 2000 , 2 , 3 );
LocalDate stopDateNextMonth = stopDate.with( TemporalAdjusters.firstDayOfNextMonth() );
YearMonth ymStop = YearMonth.from( stopDateNextMonth );

每月循环。

顺便说一下,您可以通过Month枚举对象询问本月的本地化名称。

YearMonth ym = ymStart;
do {
    int daysInMonth = ym.lengthOfMonth ();
    String monthName = ym.getMonth ().getDisplayName ( TextStyle.FULL , Locale.CANADA_FRENCH );

    System.out.println ( ym + " : " + daysInMonth + " jours en " + monthName );

    // Prepare for next loop.
    ym = ym.plusMonths ( 1 );
} while ( ym.isBefore ( ymStop ) );
  

2000-01:31 jours en janvier

     

2000-02:29 joursenfévrier

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore