java获取给定月份和给定年份的第一个日期和最后一个日期

java获取给定月份和给定年份的第一个日期和最后一个日期,java,date,calendar,Java,Date,Calendar,我正在尝试获取给定月份和年份的第一个日期和最后一个日期。我使用以下代码以yyyyMMdd格式获取最后一个日期。但无法获取此格式。然后我希望开始日期的格式相同。我还在做这个。有人能帮我修复下面的代码吗 public static java.util.Date calculateMonthEndDate(int month, int year) { int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 3

我正在尝试获取给定月份和年份的第一个日期和最后一个日期。我使用以下代码以yyyyMMdd格式获取最后一个日期。但无法获取此格式。然后我希望开始日期的格式相同。我还在做这个。有人能帮我修复下面的代码吗

public static java.util.Date calculateMonthEndDate(int month, int year) {
    int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int day = daysInAMonth[month];
    boolean isLeapYear = new GregorianCalendar().isLeapYear(year);

    if (isLeapYear && month == 2) {
        day++;
    }
    GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
    java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
    return monthEndDate;
}

public static void main(String[] args) {
    int month = 3;
    int year = 2076;
    final java.util.Date calculatedDate = calculateMonthEndDate(month, year);
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
    format.format(calculatedDate);
    System.out.println("Calculated month end date : " + calculatedDate);
} 
换成

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String formattedDate =  format.format(calculatedDate);
System.out.println("Calculated month end date : " + formattedDate);
更多细节

另一种方法

package com.shashi.mpoole;

import java.text.SimpleDateFormat; 
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DateMagic {

     public static String PATTERN = "yyyyMMdd";

     static class Measure {
           private int month;
           private int year;
           private Calendar calendar;

           public Measure build() {

                calendar = Calendar.getInstance();
                calendar.set(year, month, 1);

                return this;
           }

           public Measure(int year, int month) {
                this.year(year);
                this.month(month);
           }

           public String min() {
                  return format(calendar.getActualMinimum(Calendar.DATE));
           }

           public String max() {
                  return format(calendar.getActualMaximum(Calendar.DATE));
           }

           private Date date(GregorianCalendar c) {
                  return new java.util.Date(c.getTime().getTime());

           }

           private GregorianCalendar gc(int day) {
                  return new GregorianCalendar(year, month, day);
           }

           private String format(int day) {

                  SimpleDateFormat format = new SimpleDateFormat(PATTERN);
                  return format.format(date(gc(day)));
           }

           public void month(int month) {
                  this.month = month - 1;
           }

           public void year(int year) {
                  this.year = year;
           }
      }

      public static void main(String[] args) {

             Measure measure = new Measure(2020, 6).build();

             System.out.println(measure.min());
             System.out.println(measure.max());

        
    }

}

要获取开始日期,请执行以下操作

    GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
    java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
    System.out.println(monthEndDate);
Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
注意:开始日期中的=1)

对于格式化的

SimpleDateFormat format = new SimpleDateFormat(/////////add your format here);
System.out.println("Calculated month end date : " + format.format(calculatedDate));

请在每月最后一天尝试以下代码:-

Calendar c = Calendar.getInstance();      
c.set(2012,3,1); //------>  
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");  
System.out.println(sdf.format(c.getTime())); 

只需使用Calendar类即可。您应该为月份变量指定您想要的月份

        Calendar gc = new GregorianCalendar();
        gc.set(Calendar.MONTH, month);
        gc.set(Calendar.DAY_OF_MONTH, 1);
        Date monthStart = gc.getTime();
        gc.add(Calendar.MONTH, 1);
        gc.add(Calendar.DAY_OF_MONTH, -1);
        Date monthEnd = gc.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

        System.out.println("Calculated month start date : " + format.format(monthStart));
        System.out.println("Calculated month end date : " + format.format(monthEnd));

虽然不是OP问题的确切答案,但以下方法将以Java 8+LocalDate实例的形式给出当前月份的第一个和最后一个日期

public static LocalDate getCurrentMonthFirstDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).withDayOfMonth(1);
}

public static LocalDate getCurrentMonthLastDate() {
    return LocalDate.ofEpochDay(System.currentTimeMillis() / (24 * 60 * 60 * 1000) ).plusMonths(1).withDayOfMonth(1).minusDays(1);
}
旁注:使用
LocalDate.ofEpochDay(…)
而不是
LocalDate.now()
可以大大提高性能。此外,使用每日毫秒表达式而不是结束值(即
86400000
)的性能更好。我最初认为后者会比表达式P表现得更好

为什么这个答案:即使这不是OP问题的正确答案,我仍然在这里回答,因为当我搜索“java 8 get month start date”时,Google显示了这个问题:)

java.time.YearMonth
方法
::atDay
&
::atEndOfMonth
Java8()中的新版本提供了相应的命令

恰当命名的类表示一年中的一个月,没有任何特定的日期或时间。从那里我们可以询问每月的第一天和第二天

YearMonth yearMonth = YearMonth.of( 2015, 1 );  // January of 2015.
LocalDate firstOfMonth = yearMonth.atDay( 1 );
LocalDate last = yearMonth.atEndOfMonth();

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期Android(第一天:

          GregorianCalendar gc = new GregorianCalendar(year, month-1, 1);
          java.util.Date monthEndDate = new java.util.Date(gc.getTime().getTime());
          System.out.println(monthEndDate);
      
      Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH);
      
      月的最后一天:

      Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
      

      那么,您得到了什么结果?为什么要从
      日期
      (日历.getTime()的结果转换为
      ,然后创建一个新的
      日期
      )?您是否可以切换到使用Joda Time,这将使所有这些变得更加整洁?您的答案应该包含对代码的解释以及它如何解决问题的描述。仅供参考,像、
      java.text.simpleDataFormat等麻烦的旧日期时间类现在已被java 8和更高版本.Se中内置的类所取代e.FYI,像,
      java.text.simpledteformat
      这样非常麻烦的旧日期时间类现在被内置在Java8和更高版本中的类所取代。参见.FYI,像,
      GregorianCalendar
      java.text.simpledteformat
      这样非常麻烦的日期时间类现在被类所取代s内置于Java 8及更高版本中。请参阅。这无法正常工作。请尝试通过第6个月,即6月。您将获得第一个日期2020-06-01和结束日期2020-07-01。谢谢@Sadda Hussain。问题已修复。
      public static Date[] getMonthInterval(Date data) throws Exception {
      
          Date[] dates = new Date[2];
      
          Calendar start = Calendar.getInstance();
          Calendar end = Calendar.getInstance();
      
          start.setTime(data);
          start.set(Calendar.DAY_OF_MONTH, start.getActualMinimum(Calendar.DAY_OF_MONTH));
          start.set(Calendar.HOUR_OF_DAY, 0);
          start.set(Calendar.MINUTE, 0);
          start.set(Calendar.SECOND, 0);
      
          end.setTime(data);
          end.set(Calendar.DAY_OF_MONTH, end.getActualMaximum(Calendar.DAY_OF_MONTH));
          end.set(Calendar.HOUR_OF_DAY, 23);
          end.set(Calendar.MINUTE, 59);
          end.set(Calendar.SECOND, 59);
      
          //System.out.println("start "+ start.getTime());
          //System.out.println("end   "+ end.getTime());
      
          dates[0] = start.getTime();
          dates[1] = end.getTime();
      
          return dates;
      }