Java 获取给定字符串日期中的月份最后一天

Java 获取给定字符串日期中的月份最后一天,java,date,calendar,Java,Date,Calendar,我的输入字符串日期如下所示: String date = "1/13/2012"; SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); Date convertedDate = dateFormat.parse(date); String month = new SimpleDateFormat("MM").format(convertedDate); 我得到的月份如下: String date = "1/13/

我的输入字符串日期如下所示:

String date = "1/13/2012";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date convertedDate = dateFormat.parse(date);
String month = new SimpleDateFormat("MM").format(convertedDate);
我得到的月份如下:

String date = "1/13/2012";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date convertedDate = dateFormat.parse(date);
String month = new SimpleDateFormat("MM").format(convertedDate);
但是如何在给定的字符串日期中获取一个月的最后一个日历日


例如:对于字符串
“1/13/2012”
而言,输出必须是
“1/31/2012”

使用
格雷戈里安达伦。设置对象的日期,然后使用
getActualMaximum(Calendar.DAY\u IN\u MONTH)

(但在Java1.4中是相同的)

Java8及更高版本。 通过使用
convertedDate.getMonth().length(convertedDate.isLeapYear())
其中
convertedDate
LocalDate
的一个实例

String date = "1/13/2012";
LocalDate convertedDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("M/d/yyyy"));
convertedDate = convertedDate.withDayOfMonth(
                                convertedDate.getMonth().length(convertedDate.isLeapYear()));
Java7及以下版本。 通过使用
java.util.Calendar
getActualMaximum
方法:

String date = "1/13/2012";
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date convertedDate = dateFormat.parse(date);
Calendar c = Calendar.getInstance();
c.setTime(convertedDate);
c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));

这看起来像是您的需要:

代码:

输出:

Today            : 2010-08-03  
Last Day of Month: 2010-08-31  
Date : 2013-05-31
2012-01-31

最简单的方法是构造一个新的
GregorianCalendar
实例,如下所示:

Calendar cal = new GregorianCalendar(2013, 5, 0);
Date date = cal.getTime();
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("Date : " + sdf.format(date));
输出:

Today            : 2010-08-03  
Last Day of Month: 2010-08-31  
Date : 2013-05-31
2012-01-31
注意:

month用于在日历中设置月日历字段的值。月份值以0为基础,例如1月份为0


我在JasperServer报告中使用这一行:

new SimpleDateFormat("yyyy-MM-dd").format(new SimpleDateFormat("yyyy-MM-dd").parse(new java.util.Date().format('yyyy') + "-" + (new Integer (new SimpleDateFormat("MM").format(new Date()))+1) + "-01")-1)
看起来不好看,但对我来说很有用。基本上是在当前月份加1,得到该月份的第一天,减去一天

使用Java 8
DateTime
/
LocalDateTime

输出:

Today            : 2010-08-03  
Last Day of Month: 2010-08-31  
Date : 2013-05-31
2012-01-31
如果日期字符串中有时间信息,则应使用
LocalDateTime
而不是
LocalDate
。即
2015/07/22 16:49


您可以使用以下代码来获取月份的最后一天

public static String getLastDayOfTheMonth(String date) {
        String lastDayOfTheMonth = "";

        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        try{
        java.util.Date dt= formatter.parse(date);
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(dt);  

        calendar.add(Calendar.MONTH, 1);  
        calendar.set(Calendar.DAY_OF_MONTH, 1);  
        calendar.add(Calendar.DATE, -1);  

        java.util.Date lastDay = calendar.getTime();  

        lastDayOfTheMonth = formatter.format(lastDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return lastDayOfTheMonth;
    }

通过使用java 8 java.time.LocalDate

String date = "1/13/2012";
LocalDate lastDayOfMonth = LocalDate.parse(date, DateTimeFormatter.ofPattern("M/dd/yyyy"))
       .with(TemporalAdjusters.lastDayOfMonth());

这对我来说很好

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone());
    cal.set(Calendar.MONTH, month-1);  
    cal.set(Calendar.YEAR, year);  
    cal.add(Calendar.DATE, -1);  
    cal.set(Calendar.DAY_OF_MONTH, 
    cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTimeInMillis();
public静态字符串getLastDayOfMonth(整数年,整数月)引发异常{
DateFormat sdf=新的简化格式(“yyyy-MM-dd”);
Date Date=sdf.parse(year+“-”+(month您可以使用Java8中的和方法:

// Parse your date into a LocalDate
LocalDate parsed = LocalDate.parse("1/13/2012", DateTimeFormatter.ofPattern("M/d/yyyy"));

// We only care about its year and month, set the date to first date of that month
LocalDate localDate = LocalDate.of(parsed.getYear(), parsed.getMonth(), 1);

// Add one month, subtract one day 
System.out.println(localDate.plusMonths(1).minusDays(1)); // 2012-01-31

Java8及以上版本:

import java.time.LocalDate;
import java.time.Year;

static int lastDayOfMonth(int Y, int M) {
    return LocalDate.of(Y, M, 1).getMonth().length(Year.of(Y).isLeap());
}
以巴兹尔·布尔克的评论为准

import java.time.YearMonth;

int lastDayOfMonth = YearMonth.of(Y, M).lengthOfMonth();
太长,读不下去了 看这个

2012-01-31

YearMonth
YearMonth
类简化了这一过程。
atEndOfMonth
方法返回一个
LocalDate
。二月的闰年被计算在内

首先定义与字符串输入匹配的格式化模式

String s = "1/13/2012" ;
LocalDate ld = LocalDate.parse( "1/13/2012" , f ) ;
DateTimeFormatter f=模式(“M/d/UUU”)的DateTimeFormatter

使用该格式化程序从字符串输入中获取
LocalDate

String s = "1/13/2012" ;
LocalDate ld = LocalDate.parse( "1/13/2012" , f ) ;
然后提取一个
YearMonth
对象

YearMonth ym = YearMonth.from( ld ) ;
要求
YearMonth
确定该年当月的最后一天,即2月份

LocalDate endOfMonth = ym.atEndOfMonth() ;
以标准ISO 8601格式生成表示该日期的文本

String output = endOfMonth.toString() ;  

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

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

要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android( 在Java1.8中测试。
      我希望这会对一些人有所帮助。

      我认为最简单、最快的方法是

      public static int getLastDayOf(int month, int year) {
          switch (month) {
              case Calendar.APRIL:
              case Calendar.JUNE:
              case Calendar.SEPTEMBER:
              case Calendar.NOVEMBER:
                  return 30;
              case Calendar.FEBRUARY:
                  if (year % 4 == 0) {
                      return 29;
                  }
                  return 28;
              default:
                  return 31;
          }
      }
      

      由于这些值都是常量!

      如何使用给定的“1/13/2012”?如何使用给定的“1/13/2012”?在日历上调用
      setTime
      。使用
      temporaladjusts的Java 8解决方案。lastDayOfMonth()
      中建议的更简单。事实上,信息非常丰富,或者也可以使用以下代码查找月份的最长日期。
      LocalDate.now().getMonth().maxLength()
      另一个变体是类。
      LocalDate endOfMonth=YearMonth.from(myLocalDate).atEndOfMonth();
      日期。withDayOfMonth(date.getMonth().maxLength())
      将在2月份失败。请参阅以获取解决方案。@AleksandrM感谢您指出这一点。我已根据您的提示更新了我的答案。实际上我使用了临时调整器。lastDayOfMonth()现在我明白了。要不要添加一些讨论或解释来给出更好的答案?例如,提及
      TemporalAdjuster
      接口和
      TemporalAdjusters
      类来实现。堆栈溢出不仅仅是一个代码段库。而且,感谢您的贡献。仅供参考,
      java.util.Date
      是一个d
      SimpleDateFormat
      类现在是遗留类,被java.time类取代。有关使用
      LocalDate
      和其他现代日期时间类的示例,请参阅和的答案。或者.FYI,麻烦的
      Calendar
      类现在是遗留类,被java.time类取代。请参阅及其注释。此代码使用trouB有些旧日期时间类已经遗留多年,被java.time类取代。这个答案是不明智的。比这个更简单。@BasilBourque我不认为这更简单。我认为这是不同的。仅供参考,非常麻烦的旧日期时间类,如和
      java.text.simpleDataFormat
      ,现在被取代了通过Java 8和更高版本中内置的类。请参阅。这个问题需要解析字符串。您在这里没有解决这个问题。此代码可以通过使用约定进行简化,Java变量以小写字母命名。与
      LocalDate相比,这里只是一个细节。使用
      ,需要实例化
      YearMonth