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是正确的,我研究了它,但无法找到任何有用的东西。

+0

你可以使用Java 8或JodaTime吗? – reto 2015-03-13 07:06:10

+0

如果您无法访问后面的库,我建议您获取下个月第一天的工作日并根据这些计算结果进行计算。 – Bathsheba 2015-03-13 07:08:07

+0

记住'日历'月是零索引 – MadProgrammer 2015-03-13 07:12:27

尝试这种方式

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(); 
    } 

source

+0

其给予3月29日和它的最后一个星期日,是不是? – SpringLearner 2015-03-13 07:20:04

+0

@Braj看到这个http://ideone.com/GnPNHV – SpringLearner 2015-03-13 07:22:50

+0

它仍然给出了同样的错误,我的问题不是与月份索引我知道它从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); 
  1. 然后减去天从当前日期TOT的最后数周日: JAVA为SUNDAY设置1个,为MONDAY设置2个等等。所以,如果最后一天是星期一,也就是2,那么它会从中减去1以得到本月的最后一个星期日。
  2. 希望它能帮助。

开始=“3”>
+0

它的工作,但你能解释一下吗? – mrahmat 2015-03-13 07:53:34

+0

编辑答案。请检查。 – Wanted 2015-03-13 13:50:51

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.DateCalendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore