我正在使用以下代码检索上个月的最后一天-例如:5月。但是它返回的是30天而不是31天。
下面给出的代码
package net.vcmg.date;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang.time.DateUtils;
public class LastDayPreviousMonth {
public static void main(String[] args) {
Date lastDateOfPreviousMonth = addMonths(lastDayOfTheMonth(today()), -1);
System.out.println("lastDateOfPreviousMonth: "+lastDateOfPreviousMonth);
}
//the below method is from Utils.java
public static Date lastDayOfTheMonth(Date d) {
Calendar cal = Calendar.getInstance();
cal.setTime(d);
int actualMax = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, actualMax);
return cal.getTime();
}
public static Date addMonths(Date date, int numMonths)
{
return DateUtils.addMonths(date, numMonths);
}
public static Date today()
{
return truncDate(now());
}
public static Date now()
{
// will cut-off milliseconds
return new Date( (System.currentTimeMillis()/1000) * 1000);
}
public static Date truncDate (Date date) {
return DateUtils.truncate(date, Calendar.DATE);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,当我在main方法中调用lastDateOfPreviousMonth时,它仅返回30天。不是31号,实际上可能包含31天。请帮忙。
Java 8
如果您不限制使用旧版本Date
,则最好使用新版本java.time.LocalDate
LocalDate previousMonth = LocalDate.now().minusMonths(1);
LocalDate start = previousMonth.withDayOfMonth(1);
LocalDate end = previousMonth.withDayOfMonth(previousMonth.lengthOfMonth());
System.out.println(start);
System.out.println(end);
Run Code Online (Sandbox Code Playgroud)
输出量
2019-05-01
2019-05-31
Run Code Online (Sandbox Code Playgroud)
编辑
为了您的实施,更改方法的顺序
addMonths(new Date(), -1)
lastDayOfTheMonth(addMonths(new Date(), -1))
Date lastDateOfPreviousMonth = lastDayOfTheMonth(addMonths(new Date(), -1));
Run Code Online (Sandbox Code Playgroud)
输出量
lastDateOfPreviousMonth: Fri May 31 10:46:13 EEST 2019
Run Code Online (Sandbox Code Playgroud)