如何获得上个月的第一个日期和最后日期? (JAVA)
在今天的日期,我应该得到上个月的第一个日期和最后日期。 我无法想出任何逻辑。
例如,在2012年5 05/30/2012
通过时,我应该在04/01/2012
和04/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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
- Java SE 8 , Java SE 9 , Java SE 10及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java 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的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
使用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();