我想得到这个月的最后一个日期,并在其中添加n个月,但在Java中,日历实例只需要30天

我想得到这个月的最后一个日期,并在其中添加n个月,但在Java中,日历实例只需要30天,java,datetime,Java,Datetime,由于当月为4月,最后一个日期为2020-04-30 下个月最后一天我应该拿到2020-05-31 但我得到的最后日期是2020-05-30 我做错什么了吗 您最好像这样使用LocalDate: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calender = Calendar.getInstance(); calender.set(Calendar.DAY_OF_MONTH, calender.getAc

由于当月为4月,最后一个日期为2020-04-30 下个月最后一天我应该拿到2020-05-31 但我得到的最后日期是2020-05-30


我做错什么了吗

您最好像这样使用
LocalDate

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calender = Calendar.getInstance();
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DATE));
int months = 1;
calender.add(Calendar.MONTH, months );
String time = sdf .format(calender .getTime());
System.out.println(time);

您最好像这样使用
LocalDate

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calender = Calendar.getInstance();
calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DATE));
int months = 1;
calender.add(Calendar.MONTH, months );
String time = sdf .format(calender .getTime());
System.out.println(time);
java.time 我建议您使用java.time(现代java日期和时间API)进行日期工作。使用它比使用旧类
Calendar
SimpleDateFormat
要好得多

LocalDate now = LocalDate.now();
LocalDate lastDay = now.withDayOfMonth(now.lengthOfMonth());
LocalDate nextMonth = lastDay.plusMonths(1);
今天运行时的输出:

下个月最后一天:2020-05-31

一个
YearMonth
,顾名思义,是没有月日的一年和一个月。它有一个
atEndOfMonth
方法,可以方便地将一个月的最后一天作为
LocalDate
给出。一个
LocalDate
是一个没有时间的日期,所以我们需要这里。它的
toString
方法方便地提供了您想要的格式(ISO 8601)

根据你为什么想要另一个月最后一天的原因,你可以考虑其他几种方法。如果您需要处理始终以月份边界开始和结束的日期范围,您可以:

  • 将您的范围表示为
    YearMonth
    对象的范围。这会让你完全不知道这个月的最后一天吗
  • 将您的销售范围的末尾表示为下个月的第一个月。每个月的第一天做数学比较简单,因为不管一个月有多长,都是第一天
  • 你的代码出了什么问题? 无论使用
    Calendar
    LocalDate
    或其他类,您都需要按相反的顺序执行操作:首先添加一个月,然后查找月底。正如你所知道的,月份有不同的长度,所以重要的部分是在这个月的最后一天。换言之:将
    LocalDate
    Calendar
    设置为月份的最后一天可以正确地将其设置为qustion中月份的最后一天,但不会指示其在随后更改其值(例如添加月份)后停留在月份的最后一天。如果你在4月29日加上一个月,你就得到了5月29日。如果你在4月30日加上一个月,你就得到了5月30日。在这里,30是4月的最后一天而30不是5月的最后一天并不重要

    链接
    • 解释如何使用java.time
    java.time 我建议您使用java.time(现代java日期和时间API)进行日期工作。使用它比使用旧类
    Calendar
    SimpleDateFormat
    要好得多

    LocalDate now = LocalDate.now();
    LocalDate lastDay = now.withDayOfMonth(now.lengthOfMonth());
    LocalDate nextMonth = lastDay.plusMonths(1);
    
    今天运行时的输出:

    下个月最后一天:2020-05-31

    一个
    YearMonth
    ,顾名思义,是没有月日的一年和一个月。它有一个
    atEndOfMonth
    方法,可以方便地将一个月的最后一天作为
    LocalDate
    给出。一个
    LocalDate
    是一个没有时间的日期,所以我们需要这里。它的
    toString
    方法方便地提供了您想要的格式(ISO 8601)

    根据你为什么想要另一个月最后一天的原因,你可以考虑其他几种方法。如果您需要处理始终以月份边界开始和结束的日期范围,您可以:

  • 将您的范围表示为
    YearMonth
    对象的范围。这会让你完全不知道这个月的最后一天吗
  • 将您的销售范围的末尾表示为下个月的第一个月。每个月的第一天做数学比较简单,因为不管一个月有多长,都是第一天
  • 你的代码出了什么问题? 无论使用
    Calendar
    LocalDate
    或其他类,您都需要按相反的顺序执行操作:首先添加一个月,然后查找月底。正如你所知道的,月份有不同的长度,所以重要的部分是在这个月的最后一天。换言之:将
    LocalDate
    Calendar
    设置为月份的最后一天可以正确地将其设置为qustion中月份的最后一天,但不会指示其在随后更改其值(例如添加月份)后停留在月份的最后一天。如果你在4月29日加上一个月,你就得到了5月29日。如果你在4月30日加上一个月,你就得到了5月30日。在这里,30是4月的最后一天而30不是5月的最后一天并不重要

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

    不要使用
    java.util.*
    中不推荐的类

    使用
    java.time.*
    中的类

    带有
    LocalDate
    的示例:

        LocalDate endOfNextMonth = 
                YearMonth                            // Represent an entire month in a particular year.
                .now(ZoneId.of("Europe/Volgograd"))  // Capture the current year-month as seen in a particular time zone. Returns a `YearMonth` object.
                .plusMonths(1)                       // Move to the next month. Returns another `YearMonth` object.
                .atEndOfMonth();                     // Determine the last day of that year-month. Returns a `LocalDate` object.
    
        String time = endOfNextMonth.toString();     // Represent the content of the `LocalDate` object by generating text in standard ISO 8601 format.
    
        System.out.println("Last day of next month: " + time);
    
    输出:

    public class Testing {
        public static void main(String args[]) {
          DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          LocalDate date = LocalDate.now();
          int months = 1;
          date = date.plusMonths(months);
          date = date.withDayOfMonth(date.lengthOfMonth());
          System.out.println(date.format(dateTimeFormatter));
        }
    }
    
     public class Testing {
          public static void main(String args[]) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calender = Calendar.getInstance();
            int months = 1;
            calender.add(Calendar.MONTH, months);
            calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
            String time = sdf.format(calender.getTime());
            System.out.println(time);
        }
    }
    
    带有
    日历的示例

    2020-05-31
    
    输出:

    public class Testing {
        public static void main(String args[]) {
          DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          LocalDate date = LocalDate.now();
          int months = 1;
          date = date.plusMonths(months);
          date = date.withDayOfMonth(date.lengthOfMonth());
          System.out.println(date.format(dateTimeFormatter));
        }
    }
    
     public class Testing {
          public static void main(String args[]) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calender = Calendar.getInstance();
            int months = 1;
            calender.add(Calendar.MONTH, months);
            calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
            String time = sdf.format(calender.getTime());
            System.out.println(time);
        }
    }
    

    不要使用
    java.util.*
    中不推荐使用的类

    使用
    java.time.*
    中的类

    带有
    LocalDate
    的示例:

        LocalDate endOfNextMonth = 
                YearMonth                            // Represent an entire month in a particular year.
                .now(ZoneId.of("Europe/Volgograd"))  // Capture the current year-month as seen in a particular time zone. Returns a `YearMonth` object.
                .plusMonths(1)                       // Move to the next month. Returns another `YearMonth` object.
                .atEndOfMonth();                     // Determine the last day of that year-month. Returns a `LocalDate` object.
    
        String time = endOfNextMonth.toString();     // Represent the content of the `LocalDate` object by generating text in standard ISO 8601 format.
    
        System.out.println("Last day of next month: " + time);
    
    输出:

    public class Testing {
        public static void main(String args[]) {
          DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          LocalDate date = LocalDate.now();
          int months = 1;
          date = date.plusMonths(months);
          date = date.withDayOfMonth(date.lengthOfMonth());
          System.out.println(date.format(dateTimeFormatter));
        }
    }
    
     public class Testing {
          public static void main(String args[]) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calender = Calendar.getInstance();
            int months = 1;
            calender.add(Calendar.MONTH, months);
            calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
            String time = sdf.format(calender.getTime());
            System.out.println(time);
        }
    }
    
    带有
    日历的示例

    2020-05-31
    
    输出:

    public class Testing {
        public static void main(String args[]) {
          DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
          LocalDate date = LocalDate.now();
          int months = 1;
          date = date.plusMonths(months);
          date = date.withDayOfMonth(date.lengthOfMonth());
          System.out.println(date.format(dateTimeFormatter));
        }
    }
    
     public class Testing {
          public static void main(String args[]) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calender = Calendar.getInstance();
            int months = 1;
            calender.add(Calendar.MONTH, months);
            calender.set(Calendar.DAY_OF_MONTH, calender.getActualMaximum(Calendar.DAY_OF_MONTH));
            String time = sdf.format(calender.getTime());
            System.out.println(time);
        }
    }
    

    我建议您不要使用
    SimpleDateFormat
    Calendar
    。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。只需使用
    LocalDate
    from即可。我建议您不要使用
    SimpleDateFormat
    Calendar
    。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。相反,只需使用
    LocalDate
    from。使用java.time是一个非常好的主意。您的代码仍然给出了
    2020-05-30
    ,但不是
    2020-05-31
    ,因此您没有真正回答这个问题。使用java.time是一个非常好的主意。您的代码仍然给出
    2020-05-30
    ,千