java上个星期天的一个月

时间:2015-03-13 07:04:35

标签: 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(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是否正确,我研究了它但是找不到任何有用的东西。

3 个答案:

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

source

答案 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);
  1. 然后减去当前日期到最后一个星期日的天数: JAVA为SUNDAY设置1,为MONDAY设置2,依此类推。因此,如果最后一天是星期一,即2,那么它将从中减去1以获得该月的最后一个星期日。
  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.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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore