我正在尝试使用以下代码,但它返回了错误的月份。
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();
获取本月的天数:
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
将日历设置为本月的最后一天:
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
我会为下个月的第一天创建一个日期对象,然后从日期对象中减去一天。
YearMonth.from(
LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()
问题和其他答案使用旧的过时类。它们已被Java 8 及更高版本中内置的java.time类所取代。请参阅Oracle 教程。大部分功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
LocalDate
该类LocalDate
表示没有时间和时区的仅日期值。虽然这些对象不存储时区,但请注意时区对于确定当前日期至关重要。对于任何给定的时刻,日期都会因时区而在全球范围内变化。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId ); // 2016-06-25
YearMonth
结合YearMonth
班级确定任何一个月的最后一天。
YearMonth currentYearMonth = YearMonth.from( today ); // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth(); // 2016-06-30
顺便说一句,两者都LocalDate
使用YearMonth
月份数字(1-12),而不是在旧的日期时间类中看到的怪异的 0-11。许多糟糕的设计决策之一,使那些旧的日期时间类变得如此麻烦和混乱。
TemporalAdjuster
另一种有效的方法是使用TemporalAdjuster
. 请参阅Pierre Henry 的正确答案。
看起来您将日历设置为下个月的第一天,因此您需要多行减去一天,以获得sampleDay所在月份的最后一天:
Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);
一般来说,使用Joda Time做这种事情要容易得多,例如:
DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();
使用 calObject.getActualMaximum(calobject.DAY_OF_MONTH)
有关这方面的更多信息,请参阅Real 的 Java How-to。
TemporalAdjuster
使用(相对)新的 Java 日期 API,实际上非常简单:
让date
是 的一个实例LocalDate
,例如:
LocalDate date = LocalDate.of(2018, 1, 22);
或者
LocalDate date = LocalDate.now();
或者,当然,您可以将其作为用户输入、从数据库等获取。
然后应用类TemporalAdjuster
中找到的接口的实现TemporalAdjusters
:
LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());
如果您使用date4j库:
DateTime monthEnd = dt.getEndOfMonth();
我认为这应该很好用:
Dim MyDate As Date = #11/14/2012# 'This is just an example date
MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)