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

ven*_*bhi 18 java datetime date

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

例如,在通过时05/30/2012,我应该得到04/01/201204/30/2012.

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

Jig*_*shi 32

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();
Run Code Online (Sandbox Code Playgroud)

看到

  • 仅供参考,麻烦的旧日期时间类,例如 [`java.util.Date`](https://docs.oracle.com/javase/8/docs/api/java/util/Date.html),[` java.util.Calendar`](https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) 和 `java.text.SimpleTextFormat` 现在是 [legacy](https ://en.wikipedia.org/wiki/Legacy_system),由 [java.time](https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) 取代) 类。请参阅 [Oracle 教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 (2认同)

Bas*_*que 6

TL;博士

YearMonth.now().minusMonths( 1 ).atDay( 1 )
Run Code Online (Sandbox Code Playgroud)

…和…

YearMonth.now().minusMonths( 1 ).atEndOfMonth()
Run Code Online (Sandbox Code Playgroud)

避免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();
Run Code Online (Sandbox Code Playgroud)

乔达时间

UPDATE:乔达时间的项目现在处于维护模式,与团队的建议迁移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 );
Run Code Online (Sandbox Code Playgroud)

关于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类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.


Sea*_*oyd 4

使用乔达时间

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);
Run Code Online (Sandbox Code Playgroud)

输出:

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

说明: DateMidnight 对象是没有时间信息的日期对象,这似乎正是您所需要的。如果没有,请将上述代码中出现的所有 DateMidnight 替换为 DateTime。