Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 上个月的最后日期返回5月的30天_Java_Date - Fatal编程技术网

Java 上个月的最后日期返回5月的30天

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

我正在使用下面的代码检索上个月的最后一天-例如: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[] 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-获取当前日期并提供上一个月
    addMonths(新日期(),-1)
  • LastDayOfMonth-获取上个月的最后一天
    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)的其他类。这也将使您免于对Apache
    DateUtils
    的外部依赖,因为它的功能通常内置于现代类中

    链接
    • 解释如何使用java.time

    您正在使用糟糕的日期时间类,这些类在几年前被采用JSR 310的现代java.time类所取代。