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 8DateTime
/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
是一个dSimpleDateFormat
类现在是遗留类,被java.time类取代。有关使用LocalDate
和其他现代日期时间类的示例,请参阅和的答案。或者.FYI,麻烦的Calendar
类现在是遗留类,被java.time类取代。请参阅及其注释。此代码使用trouB有些旧日期时间类已经遗留多年,被java.time类取代。这个答案是不明智的。比这个更简单。@BasilBourque我不认为这更简单。我认为这是不同的。仅供参考,非常麻烦的旧日期时间类,如和java.text.simpleDataFormat
,现在被取代了通过Java 8和更高版本中内置的类。请参阅。这个问题需要解析字符串。您在这里没有解决这个问题。此代码可以通过使用约定进行简化,Java变量以小写字母命名。与LocalDate相比,这里只是一个细节。使用
,需要实例化YearMonth