我想得到任何一个月的最后一个星期日,并且如果星期日是下个月的第一天它显示的是日期而不是同一个月的上周,它会在一些输入上工作。这是什么
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是否正确,我研究了它但是找不到任何有用的东西。
答案 0 :(得分: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();
}
答案 1 :(得分:1)
试试这个(记住月份值是0,例如,1月份为0)
Calendar cal = Calendar.getInstance();
cal.set(year, month, 1);
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DATE, -1);
cal.add(Calendar.DATE, -(cal.get(Calendar.DAY_OF_WEEK) -1));
return cal.getTime().toString().substring(0, 10);
因此,如果您想在2015年10月之前调用此方法,请按以下方式调用:
getLastSunday(9, 2015);
它做了以下事情: 1.将传递的年份和星期一设置为日历对象 getLastSunday(9,2015); 2.然后使用以下代码将日历对象更新为当月的最后一天:
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DATE, -1);
希望它有所帮助。
答案 2 :(得分:1)
YearMonth.of( 2015 , Month.NOVEMBER ) // Represent the entirety of a specified month.
.atEndOfMonth() // Get the date of the last day of that month.
.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) // Move to the previous Sunday, or keep if already Sunday.
问题和其他答案已经过时了,使用了现在遗留下来的麻烦的旧日期时间类,取而代之的是 java.time 类。
不是将年份和月份作为整数传递,而是传递YearMonth
类的单个参数。这样做可以确保有效的值,使您的代码更加自我记录,并提供类型安全。
YearMonth ym = YearMonth.of( 2015 , Month.NOVEMBER ) ; // Or YearMonth.of( 2015 , 11 ) with sane numbering for month 1-12 for January-December.
LocalDate
类表示没有时间且没有时区的仅限日期的值。
获取本月的最后一天。
LocalDate endOfMonth = ym.atEndOfMonth() ;
查找上一个星期日,或者如果已经是星期日,请保留月末。使用TemporalAdjuster
类中的TemporalAdjusters
。
LocalDate lastSundayOfPriorMonth = endOfMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) ;
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。