给定日期对象如何确定其月份的最后一天?

时间:2008-09-16 13:46:59

标签: java date

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

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

8 个答案:

答案 0 :(得分:17)

获取本月的天数:


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

答案 1 :(得分:3)

我会为NEXT月的第一天创建一个日期对象,然后从日期对象中减去一天。

答案 2 :(得分:3)

TL;博士

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.time

问题和其他答案使用旧的过时类。它们已被Java 8及更高版本中内置的java.time类取代。见Oracle Tutorial。许多功能已经被后端移植到Java 6& ThreeTen-Backport中的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

顺便说一句,LocalDateYearMonth都使用月份数(正如您所期望的那样)(1-12),而不是旧日期时间类中看到的0-11螺旋球。许多糟糕的设计决策之一,使那些旧的日期时间类如此麻烦和混乱。

TemporalAdjuster

另一种有效方法是使用TemporalAdjuster。  请参阅the correct Answer by Pierre Henry

答案 3 :(得分:2)

看起来您将日历设置为下个月的第一天,因此您还需要一行减去一天,以获得 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();

答案 4 :(得分:2)

使用calObject.getActualMaximum(calobject.DAY_OF_MONTH)

有关详细信息,请参阅Real's Java How-to

答案 5 :(得分:2)

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

答案 6 :(得分:1)

如果您使用date4j库:

DateTime monthEnd = dt.getEndOfMonth();

答案 7 :(得分:-1)

我认为这应该很好用:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)