java 一个月的最后一个星期日

java last sunday of a month

我想获取任何给定月份的最后一个星期日,它的工作到一定程度,但是如果星期日是下个月的第一天,则在某些输入中它会显示该日期而不是同月的最后一周。这是

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

returns 输出:

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

source

试试这个(记住月份值是从 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.将过去的年份和月份设置到日历对象 getLastSunday(9, 2015); 2. 然后使用此代码将日历对象更新为当月的最后一天:

cal.add(Calendar.MONTH, 1);  
cal.set(Calendar.DAY_OF_MONTH, 1);  
cal.add(Calendar.DATE, -1);
  1. 然后从当前日期到最后一个星期天减去天数: 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.

避免遗留日期时间 classes

问题和其他答案已经过时,使用麻烦的旧日期时间 classes 现在已经遗留,被 java.time classes.

使用智能对象,而不是愚蠢的基元

与其将年月仅作为整数传递,不如传递 YearMonth class 的单个参数。这样做可以确保有效值,使您的代码更加自文档化,并提供类型安全。

YearMonth ym = YearMonth.of( 2015 , Month.NOVEMBER ) ;  // Or YearMonth.of( 2015 , 11 ) with sane numbering for month 1-12 for January-December.

LocalDate class 表示没有时间和时区的仅日期值。

获取该月的最后一天。

LocalDate endOfMonth = ym.atEndOfMonth() ;

查找上一个星期日,如果已经是星期日,则保留月末。使用在 TemporalAdjusters class.

中找到的 TemporalAdjuster
LocalDate lastSundayOfPriorMonth = endOfMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.SUNDAY ) ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8, Java SE 9,及以后
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and Java SE 7
  • Android
    • Android java.time classes.
    • 捆绑实施的更高版本
    • 对于较早的 Android,ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.