【问题标题】:Start and end date of a current month当前月份的开始和结束日期
【发布时间】:2010-06-21 10:17:09
【问题描述】:

我需要 Java 中当月的开始日期和结束日期。当 JSP 页面加载当前月份时,它应该自动计算该月的开始和结束日期。它应该与年份和月份无关。即某个月有 31 天或 30 天或 28 天。这也应该满足闰年。你能帮我解决这个问题吗?

例如,如果我在列表框中选择月份 May,我需要开始日期为 1,结束日期为 31。

【问题讨论】:

    标签: java date-manipulation


    【解决方案1】:

    你去吧:

    public Pair<Date, Date> getDateRange() {
        Date begining, end;
    
        {
            Calendar calendar = getCalendarForNow();
            calendar.set(Calendar.DAY_OF_MONTH,
                    calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
            setTimeToBeginningOfDay(calendar);
            begining = calendar.getTime();
        }
    
        {
            Calendar calendar = getCalendarForNow();
            calendar.set(Calendar.DAY_OF_MONTH,
                    calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            setTimeToEndofDay(calendar);
            end = calendar.getTime();
        }
    
        return Pair.of(begining, end);
    }
    
    private static Calendar getCalendarForNow() {
        Calendar calendar = GregorianCalendar.getInstance();
        calendar.setTime(new Date());
        return calendar;
    }
    
    private static void setTimeToBeginningOfDay(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
    }
    
    private static void setTimeToEndofDay(Calendar calendar) {
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
    }
    

    PS:Pair 类只是一对两个值。

    【讨论】:

    • 这很好,但是 Pair 对于日期范围来说是一个糟糕的抽象。创建一个名为 DateRange 的真实实体会更好,因为它会给你一个添加逻辑的地方。
    • 我同意。我写这个只是作为一个例子。
    【解决方案2】:

    如果可以选择,最好避免使用可怕的 Java Date API,而改用 Jodatime。这是一个例子:

    LocalDate monthBegin = new LocalDate().withDayOfMonth(1);
    LocalDate monthEnd = new LocalDate().plusMonths(1).withDayOfMonth(1).minusDays(1);
    

    【讨论】:

    • 现在,使用 java 8 你可以用 java time 做到这一点:docs.oracle.com/javase/8/docs/api/java/time/…
    • 你可以试试这个:LocalDate monthBegin = LocalDate.now().withDayOfMonth(1); LocalDate monthEnd = LocalDate.now().plusMonths(1).withDayOfMonth(1).minusDays(1);
    【解决方案3】:

    从 Java 8 尝试 LocalDate:

    LocalDate today = LocalDate.now();
    System.out.println("First day: " + today.withDayOfMonth(1));
    System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth()));
    

    【讨论】:

      【解决方案4】:

      简单最好,试试这个

      Calendar calendar = Calendar.getInstance();
                  calendar.add(Calendar.MONTH, 0);
                  calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
                  Date monthFirstDay = calendar.getTime();
                  calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
                  Date monthLastDay = calendar.getTime();
      
              SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
              String startDateStr = df.format(monthFirstDay);
              String endDateStr = df.format(monthLastDay);
      
              Log.e("DateFirstLast",startDateStr+" "+endDateStr);
      

      【讨论】:

      【解决方案5】:
      Calendar c = Calendar.getInstance();
          int year = c.get(Calendar.YEAR);
          int month = c.get(Calendar.MONTH);
          int day = 1;
          c.set(year, month, day);
          int numOfDaysInMonth = c.getActualMaximum(Calendar.DAY_OF_MONTH);
          System.out.println("First Day of month: " + c.getTime());
          c.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1);
          System.out.println("Last Day of month: " + c.getTime());
      

      【讨论】:

      • 由于有多个其他答案,甚至是一个被接受的答案,您应该提供一些推理,说明您的答案与其他答案的区别。
      【解决方案6】:

      使用date4j 库:

      dt.getStartOfMonth();
      dt.getEndOfMonth();
      

      【讨论】:

        【解决方案7】:

        试试这个代码

        Calendar calendar = Calendar.getInstance();
        int yearpart = 2010;
        int monthPart = 11;
        int dateDay = 1;
        calendar.set(yearpart, monthPart, dateDay);
        int numOfDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("Number of Days: " + numOfDaysInMonth);
        System.out.println("First Day of month: " + calendar.getTime());
        calendar.add(Calendar.DAY_OF_MONTH, numOfDaysInMonth-1);
        System.out.println("Last Day of month: " + calendar.getTime());
        

        希望对你有帮助。

        【讨论】:

          【解决方案8】:

          如果你有java.time.YearMonth,你可以这样做:

          YearMonth startYearMonth = YearMonth.now();
          java.time.LocalDate startOfMonthDate = startYearMonth.atDay(1);    
          java.time.LocalDate endOfMonthDate   = startYearMonth.atEndOfMonth();
          

          【讨论】:

            【解决方案9】:
            Date begining, ending;
            Calendar calendar_start =BusinessUnitUtility.getCalendarForNow();
              calendar_start.set(Calendar.DAY_OF_MONTH,calendar_start.getActualMinimum(Calendar.DAY_OF_MONTH));
              begining = calendar_start.getTime();
              String start= DateDifference.dateToString(begining,"dd-MMM-yyyy");//sdf.format(begining);
            
            
               //            for End Date of month
              Calendar calendar_end = BusinessUnitUtility.getCalendarForNow();
              calendar_end.set(Calendar.DAY_OF_MONTH,calendar_end.getActualMaximum(Calendar.DAY_OF_MONTH));
                  ending = calendar_end.getTime();
                  String end=DateDifference.dateToString(ending,"dd-MMM-yyyy");//or sdf.format(end);
            
            enter code here
            
            
            
            public static Calendar getCalendarForNow() {
                    Calendar calendar = GregorianCalendar.getInstance();
                    calendar.setTime(new Date());
                    return calendar;
                }
            

            【讨论】:

            • 此代码将有助于获取当月的开始日期和结束日期
            【解决方案10】:

            对于 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() 可以大大提高性能。此外,使用millis-in-a-day 表达式而不是结束值86400000 表现更好。我最初认为后者会比表达式表现更好:P

            【讨论】:

              【解决方案11】:
              public static void main(String[] args) 
                  {
                      LocalDate today = LocalDate.now();
                      System.out.println("First day: " + 
              today.withDayOfMonth(1));
                      System.out.println("Last day: " + today.withDayOfMonth(today.lengthOfMonth()))
                  }
              

              【讨论】:

              • 您能否在您的代码答案中添加文本以使其他人能够关注您?谢谢!
              • @Mike_H 我给你这个代码的书面答案,请在你的文本编辑器上执行这个代码并运行你的答案是 Fast Day: 2019-6-01 Second Day: 2019-06-30 谢谢年轻的程序员,希望你能理解
              【解决方案12】:

              你可以如下实现:

              public void FirstAndLastDate() {
              
                  SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
                  //start date of month
                  calendarStart = Calendar.getInstance();
                  calendarStart.set(Integer.parseInt((new SimpleDateFormat("yyyy")).format(new Date().getTime()))
                          , Integer.parseInt((new SimpleDateFormat("MM")).format(new Date().getTime()))
                          , Calendar.getInstance().getActualMinimum(Calendar.DAY_OF_MONTH));
              
                  //End Date of month
                  calendarEnd = Calendar.getInstance();
                  calendarEnd.set(Integer.parseInt((new SimpleDateFormat("yyyy")).format(new Date().getTime()))
                          , Integer.parseInt((new SimpleDateFormat("MM")).format(new Date().getTime()))
                          , Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH));
              
                  Toast.makeText(this, sdf.format(calendarStart.getTime()) + "\n" + sdf.format(calendarEnd.getTime()), Toast.LENGTH_SHORT).show();
              
              }
              

              【讨论】:

              • 感谢您的贡献。请不要教年轻人使用早已过时且臭名昭著的SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API, 和它的DateTimeFormatter 中做得更好。提示:仅代码的答案很少真正有帮助。这是我们都从我的经验中学到的解释。
              【解决方案13】:

              获取当月第一天和最后一天的非常简单的步骤:

                  Calendar calendar = Calendar.getInstance();
                  
                  // Get the current date
                  Date today = calendar.getTime();
                  
                  
                  // Setting the first day of month
                  calendar.set(Calendar.DAY_OF_MONTH, 1);
                  Date firstDayOfMonth = calendar.getTime();
              
                  // Move to next month  
                  calendar.add(Calendar.MONTH, 1);
                  // setting the 1st day of the month
                  calendar.set(Calendar.DAY_OF_MONTH, 1);
                  // Move a day back from the date
                  calendar.add(Calendar.DATE, -1);
                  Date lastDayOfMonth = calendar.getTime();
              
                  // Formatting the date  
                  DateFormat sdf = new SimpleDateFormat("dd-MMM-YY");
              
                  String todayStr = sdf.format(today);
                  String firstDayOfMonthStr = sdf.format(firstDayOfMonth);
                  String lastDayOfMonthStr = sdf.format(lastDayOfMonth);
                  
                  System.out.println("Today            : " + todayStr);
                  System.out.println("Fist Day of Month: "+firstDayOfMonthStr);
                  System.out.println("Last Day of Month: "+lastDayOfMonthStr);
              

              【讨论】:

                【解决方案14】:

                为了使其更加模块化,您可以拥有一个计算 startDate 或 EndDate 的主要函数,而不是 getMonthStartDategetMonthEndDategetMonthStartEndDate 的单独方法。根据您的要求使用方法。

                public static String getMonthStartEndDate(){
                    String start = getMonthDate("START");
                    String end = getMonthDate("END");
                    String result = start + " to " + end;
                    return result;
                }
                
                public static String getMonthStartDate(){
                    String start = getMonthDate("START");
                    return start;
                }
                
                public static String getMonthEndDate(){
                    String end = getMonthDate("END");
                    return end;
                }
                
                /**
                 * @param filter 
                 * START for start date of month e.g.  Nov 01, 2013
                 * END for end date of month e.g.  Nov 30, 2013
                 * @return
                 */
                public static String getMonthDate(String filter){
                            String MMM_DD_COMMA_YYYY       = "MMM dd, yyyy";
                    SimpleDateFormat sdf = new SimpleDateFormat(MMM_DD_COMMA_YYYY);
                    sdf.setTimeZone(TimeZone.getTimeZone("PST"));
                    sdf.format(GregorianCalendar.getInstance().getTime());
                
                    Calendar cal =  GregorianCalendar.getInstance();
                    int date = cal.getActualMinimum(Calendar.DATE);
                    if("END".equalsIgnoreCase(filter)){
                        date = cal.getActualMaximum(Calendar.DATE);
                    }
                    cal.set(Calendar.DATE, date);
                    String result =  sdf.format(cal.getTime());
                    System.out.println(" " + result  );
                
                    return result;
                }
                

                【讨论】:

                  猜你喜欢
                  • 2014-03-02
                  • 1970-01-01
                  • 2012-08-09
                  • 1970-01-01
                  • 2017-10-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-07-25
                  相关资源
                  最近更新 更多