如何获得上个月的第一个日期和最后一个日期?(爪哇)tl;博士避免 j.u.Datejava.time城大时间关于 java.time

2022-09-02 02:26:24

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

例如,在传递时,我应该得到 和 。05/30/201204/01/201204/30/2012

任何帮助将不胜感激。谢谢。


答案 1

使用日历

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();


答案 2

tl;博士

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

...和。。。

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

避免 j.u.Date

避免捆绑和类,因为它们是出了名的麻烦。相反,请在 Java 8 及更高版本中使用 java.time 包java.util.Date.Calendar

java.time

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

恰如其分的 YearMonth 类表示一年中的一个月,没有任何特定的日期或时间。从那里我们可以要求每月的第一天和最后几天。

ZoneId 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 类?

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