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);
  • 然后从当前日期减去最后一个星期日的天数: JAVA将1设置为星期天,2设置为星期一,依此类推。因此,如果最后一天是星期一,即2,那么它将从中减去1,得到一个月的最后一个星期日
  • 希望能有所帮助。

    tl;博士 避免遗留日期时间类 这个问题和其他答案已经过时了,使用的是现在遗留的麻烦的旧日期时间类,被java.time类取代

    使用智能对象,而不是哑基本体 与其将年和月作为整数传递,不如传递类的单个参数。这样做可以确保有效的值,使代码更加自文档化,并提供类型安全性

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