Java 上个月的最后日期返回5月的30天
我正在使用下面的代码检索上个月的最后一天-例如:May。但它将在30天而不是31天内恢复 下面给出的代码Java 上个月的最后日期返回5月的30天,java,date,Java,Date,我正在使用下面的代码检索上个月的最后一天-例如:May。但它将在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[] ar
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);
}
}
在这里,当我在main方法中调用上个月的lastDateOfPreiousMonth时,它只返回30天。不是31日,其实五月有31天。请帮助。试试这个:
public static void main(String[] args) {
Date lastDateOfPreviousMonth = lastDayOfTheMonth(addMonths(today(), -1));
System.out.println("lastDateOfPreviousMonth: " + lastDateOfPreviousMonth);
}
当你今天打电话给我的时候,今天是30号。减去一个月后,预期结果将是30,而不是31。Java8 如果您没有使用旧的
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);
输出
2019-05-01
2019-05-31
lastDateOfPreviousMonth: Fri May 31 10:46:13 EEST 2019
编辑
对于您的实现,请更改方法的顺序
addMonths(新日期(),-1)
LastDayOfMonth(addMonths(new Date(),-1))
2019-05-01
2019-05-31
lastDateOfPreviousMonth: Fri May 31 10:46:13 EEST 2019
这是你在构思程序/算法时的一个逻辑错误。您首先找到的是一个月的最后一天,在本例中是6月30日。然后减去1个月。这就给了5月30日,而不考虑5月有31天(从
DateUtils.addMonths
的文档中没有明确说明它是这样工作的,但它在内部使用了设计拙劣且过时的Calendar
类,所以这是我们应该期待的)
相反,要按相反的顺序做事。首先查找前一个月:
YearMonth lastMonth = YearMonth.now(ZoneId.of("Asia/Kolkata")).minusMonths(1);
2019-05
由于新的一个月并非在所有时区的同一时间点开始,我建议您如图所示说明所需的时区
然后才能找到当月的最后一天:
LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();
2019-05-31
避免使用日期和日历
我建议您不要使用日期
和日历
。这些课程设计拙劣,早已过时。而是使用LocalDate
和来自java.time(现代java日期和时间API)的其他类。这也将使您免于对ApacheDateUtils
的外部依赖,因为它的功能通常内置于现代类中
链接
- 解释如何使用java.time