java一个月的最后一个星期日
我想得到任何给定月份的最后一个星期日,并且它的工作到某点上,但是如果星期日是下个月的第一天,它会显示该日期而不是同一月份上个星期。以下是java一个月的最后一个星期日
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();
}
其给予3月29日和它的最后一个星期日,是不是? – SpringLearner 2015-03-13 07:20:04
@Braj看到这个http://ideone.com/GnPNHV – SpringLearner 2015-03-13 07:22:50
它仍然给出了同样的错误,我的问题不是与月份索引我知道它从0开始,并在我的主程序中我已经修复它在运行之前,我试着你答案我仍然得到Sun Nov 01 01月的最后一个星期日 – mrahmat 2015-03-13 07:42:13
尝试了这一点(记住Month值是基于0的。例如,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.将通过的年份和monthe设置为日历对象 getLastSunday(9,2015); 2.然后通过使用此代码更新日历对象到当前月的最后一天:
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DATE, -1);
- 然后减去天从当前日期TOT的最后数周日: JAVA为SUNDAY设置1个,为MONDAY设置2个等等。所以,如果最后一天是星期一,也就是2,那么它会从中减去1以得到本月的最后一个星期日。
希望它能帮助。
TL;博士
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取代。时间类。
使用智能对象,而不是哑元
而不是通年份和月份为单纯的整数,通过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() ;
查找上一个星期日,或者如果已经是星期日,则保留月末。使用TemporalAdjusters
类中的TemporalAdjuster
。
LocalDate lastSundayOfPriorMonth = endOfMonth.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY)) ;
关于java.time
的java.time框架是建立在Java 8和更高版本。这些类取代的麻烦老legacy日期时间类,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310。
从何处获取java.time类?
-
Java SE 8,Java SE 9,后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
-
Java SE 6和Java SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
-
Android
- 更高版本java.time类的Android束实现的。
- 对于较早的Android,ThreeTenABP项目改编为三天返回端口(如上所述)。见How to use ThreeTenABP…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
和more。
你可以使用Java 8或JodaTime吗? – reto 2015-03-13 07:06:10
如果您无法访问后面的库,我建议您获取下个月第一天的工作日并根据这些计算结果进行计算。 – Bathsheba 2015-03-13 07:08:07
记住'日历'月是零索引 – MadProgrammer 2015-03-13 07:12:27