我正在尝试使用以下代码,但它返回错误的月份日期。

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.time

问题和其他答案使用旧的过时的类。他们已被取代 java.time Java 8 及更高版本中内置的类。看 甲骨文教程. 。许多功能已向后移植到 Java 6 和 7 三十后端口 并进一步适配Android 三十ABP.

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

顺便说一下,两者 LocalDateYearMonth 使用您所期望的月份数字 (1-12),而不是旧的日期时间类中看到的奇怪的 0-11。这是许多糟糕的设计决策之一,这些决策使那些旧的日期时间类变得如此麻烦和混乱。

TemporalAdjuster

另一种有效的方法是使用 TemporalAdjuster。看 皮埃尔·亨利 的正确答案.

使用 calObject.getActualMaximum(calobject.DAY_OF_MONTH)

Real 的 Java 操作方法 欲了解更多信息。

看起来您将日历设置为下个月的第一天,因此您需要再一行减去一天,以获得该月的最后一天 样品日 位于:

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

一般来说,使用来做这种事情要容易得多 乔达时间, ,例如:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

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

如果您使用 日期4j 图书馆:

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top