Java 一个月的最后一个星期日
我想得到任何给定月份的最后一个星期日,它在一定程度上起作用,但是在一些输入上,如果星期日是下个月的第一天,它会显示该日期,而不是同一个月的最后一周。这是什么Java 一个月的最后一个星期日,java,date,calendar,Java,Date,Calendar,我想得到任何给定月份的最后一个星期日,它在一定程度上起作用,但是在一些输入上,如果星期日是下个月的第一天,它会显示该日期,而不是同一个月的最后一周。这是什么 public static String getLastSunday(int month, int year) { Calendar cal = Calendar.getInstance(); cal.set(year, month, 1); if (leap(year)) { cal.add(Cal
public static String getLastSunday(int month, int year) {
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1);
if (leap(year)) {
cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK) - 2));
} else {
cal.add(Calendar.DAY_OF_MONTH, -(cal.get(Calendar.DAY_OF_WEEK)%7 - 1));
}
return cal.getTime().toString().substring(0, 10);
}
将函数调用为:
getLastSunday(10, 2015);
返回输出:
Sun Nov 01
我哪里出错了?此外,如果是闰年,我不确定从-1到-2是否正确,我对此进行了研究,但没有发现任何有用的信息。试试这种方法
public static Date getLastSunday( int month, int year ) {
Calendar cal = Calendar.getInstance();
cal.set( year, month + 1, 1 );
cal.add(Calendar.DATE, -1);
cal.add( Calendar.DAY_OF_MONTH, -( cal.get( Calendar.DAY_OF_WEEK ) - 1 ) );
return cal.getTime();
}
试试这个(记住月份值是以0为基础的,例如,1月份为0)
因此,如果您想在2015年10月调用此方法,请按如下方式调用:
getLastSunday(9, 2015);
它在做以下事情:
1.将过去的年份和月份设置为日历对象
getLastSunday(2015年9月9日);
2.然后使用以下代码将日历对象更新到当前月份的最后一天:
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DATE, -1);
YearMonth ym = YearMonth.of( 2015 , Month.NOVEMBER ) ; // Or YearMonth.of( 2015 , 11 ) with sane numbering for month 1-12 for January-December.
该类表示一个仅限日期的值,不包含一天中的时间和时区
得到一个月的最后一天
LocalDate endOfMonth = ym.atEndOfMonth() ;
查找上一个星期日,如果已经是星期日,则保留月底。使用TemporalAdjusters
类中的TemporalAdjusters
LocalDate lastSundayOfPriorMonth = endOfMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。您可以使用Java 8或JodaTime吗?如果您无法访问更高版本的库,我建议您获取下个月第一天的工作日,并以此为基础进行计算。请记住
日历
月为零索引cal.set(GregorianCalendar.day\u of u WEEK,Calendar.SUNDAY); 校准设置(GregoriaCalendar.DAY,周中,月中,-1);如果可能的话,也可以使用JodaTime,因为这会使事情变得更简单。@reto unfotunaly不,我还不习惯java8 ot joda,因为我最近开始使用java,但我计划在3月29日和最后一个星期天使用它,不是吗?@Braj看到了吗,它仍然会给出同样的错误,我的问题不是月索引,我知道它是从0开始的,在我的主程序中,我在运行之前已经修复了它,我尝试了你的答案,我仍然得到太阳11月1日的10月最后一个星期日,只需修改这两行cal.add(Calendar.DATE,-1);cal.add(Calendar.DAY/u月,-(cal.get(Calendar.DAY/u周)-1))@mrahmat看到了吗?你能解释一下吗?编辑了答案。请查收。
LocalDate endOfMonth = ym.atEndOfMonth() ;
LocalDate lastSundayOfPriorMonth = endOfMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) ;