如何获得上个月的第一个日期和最后日期? (JAVA)

在今天的日期,我应该得到上个月的第一个日期和最后日期。 我无法想出任何逻辑。

例如,在2012年5 05/30/2012通过时,我应该在04/01/201204/30/2012获得。

任何帮助都感激不尽。 谢谢。

随着Calendar

 Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1); cal.set(Calendar.DATE, 1); Date firstDateOfPreviousMonth = cal.getTime(); cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE)); // changed calendar to cal Date lastDateOfPreviousMonth = cal.getTime(); 

看到

  • ideone演示

TL;博士

 YearMonth.now().minusMonths( 1 ).atDay( 1 ) 

…和…

 YearMonth.now().minusMonths( 1 ).atEndOfMonth() 

避免juDate

避免使用捆绑的java.util.Date和.Calendar类,因为它们非常麻烦。 而是在Java 8及更高版本中使用java.time包 。

java.time

Java 8( 教程 )中的新java.time框架具有此命令。

适当命名的YearMonth类代表一年中的一个月,没有任何特定的日期或时间。 从那里我们可以要求这个月的第一天和最后一天。

 ZonedId zoneId = ZoneId.of( "America/Montreal" ); YearMonth yearMonthNow = YearMonth.now( zoneId ); YearMonth yearMonthPrevious = yearMonthNow.minusMonths( 1 ); LocalDate firstOfMonth = yearMonthPrevious.atDay( 1 ); LocalDate lastOfMonth = yearMonthPrevious.atEndOfMonth(); 

乔达时间

更新: Joda-Time项目现在处于维护模式 ,团队建议迁移到java.time类。 请参阅Oracle教程 。

在Joda-Time 2.8中,如果您不关心时间 ,请使用LocalDate类。

 LocalDate today = LocalDate.now( DateTimeZone.forID( "Europe/Paris" ) ); LocalDate firstOfThisMonth = today.withDayOfMonth( 1 ); LocalDate firstOfLastMonth = firstOfThisMonth.minusMonths( 1 ); LocalDate endOfLastMonth = firstOfThisMonth.minusDays( 1 ); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

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

使用JodaTime

 DateMidnight now = new DateMidnight(); DateMidnight beginningOfLastMonth = now.minusMonths(1).withDayOfMonth(1); DateMidnight endOfLastMonth = now.withDayOfMonth(1).minusDays(1); System.out.println(beginningOfLastMonth); System.out.println(endOfLastMonth); 

输出:

2012-04-01T00:00:00.000 + 02:00
2012-04-30T00:00:00.000 + 02:00

说明:DateMidnight对象是一个没有时间信息的日期对象,这看起来就像您需要的那样。 如果没有,请在上面的代码中用DateTime替换所有出现的DateMidnight。

你可以创建一个日历对象,将日期设置为当月的第一天(应该是第一个:P),然后你可以做两个操作:从日历对象中你可以减去特定的时间段,例如月份(这会给你上个月的第一个日期,或者一天,这会给你上个月的最后一天。我没试过,但这将是我的第一步。

还要为Jigar的答案添加一些东西。 使用DateFormat类以您在问题中指定的格式获取日期:

 DateFormat df = DateFormat.getInstance(DateFormat.SHORT); System.out.println(df.format(firstDateOfPreviousMonth)); System.out.println(df.format(lastDateOfPreviousMonth)); 

输出:

 04/01/12 04/30/12 
  Calendar cal = Calendar.getInstance(); cal.set(Calendar.DATE, 1); cal.add(Calendar.DAY_OF_MONTH, -1); Date lastDateOfPreviousMonth = cal.getTime(); cal.set(Calendar.DATE, 1); Date firstDateOfPreviousMonth = cal.getTime();