Java Calendar获得一周中的Xº日

时间:2016-12-20 13:30:29

标签: java weekday

我需要做一个方法,在下个月返回实际日期的位置。

for today (20/12/2016)
  I need to call this method whit today date
  The return given must to be (17/01/2016)
  This method must return the third Tuesday of the next month
  Is the 4 week of this month, but I need the Third Tuesday.

我尝试使用 Calendar.MONTH,Calendar.WEEK_OF_MONTH,Calendar.DAY_OF_WEEK ,但我无法获得第三个,我总是得到第四个。

有些事情是这样的:

public static Date getNextMonthDayOfWeel(Date d) {
    Calendar c = Calendar.getInstance();
    c.setTime(d);

    int week = c.get(Calendar.WEEK_OF_MONTH);
    int day = c.get(Calendar.DAY_OF_WEEK);

    //// this block
    if(!firstWeekOfMonthHad(day)){
        week++;
    }
    //// this block

    c.setFirstDayOfWeek(Calendar.SUNDAY);

    c.add(Calendar.MONTH, 1);
    c.set(Calendar.WEEK_OF_MONTH, week);
    c.set(Calendar.DAY_OF_WEEK, day);

    return c.getTime();
}

如果一个月的第一周有特定的一周,我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果您使用Java 8或更高版本,它就像:

一样简单
LocalDate.now()
.plusMonths(1)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.TUESDAY))
.plusWeeks(3);

答案 1 :(得分:1)

TL;博士

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )                         // Get current date in this particular time zone.
    .plusMonths( 1 )                                                 // Move to equivalent date in the month after.
    .with( 
        TemporalAdjusters.dayOfWeekInMonth​( 3 , DayOfWeek.TUESDAY )  // Move to the ordinal number occurrence of a day-of-week within this month.
    )                                                                

详细

你好像要问下个月的第三个星期二。

Answer by Mellgren很好,但是使用更合适的TemporalAdjuster来改变这个想法。

避免遗留类

你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

LocalDate

LocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

转到下个月。

LocalDate monthLater = today.plusMonths( 1 );

TemporalAdjuster

要移至该月的第三个星期二,请使用TemporalAdjuster课程中的TemporalAdjusters实施。

对于“月中的第三个星期二”或“本月的第一个星期四”等一个月内的序数星期几,Java提供了一个特定的调整器:TemporalAdjusters.dayOfWeekInMonth。将3之类的序号传递给“第三”,将DayOfWeek枚举对象常量传递给DayOfWeek.TUESDAY

TemporalAdjuster ta = TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.TUESDAY );  // Pass ordinal number and `DayOfWeek`. 
LocalDate thirdTuesdayOfNextMonth = monthLater.with( ta );

转储到控制台。

System.out.println( "today is " + today + " in zone " + z );
System.out.println( "Third Tuesday of next month is " + thirdTuesdayOfNextMonth );

请参阅此code run live at IdeOne.com

  

今天是2018年至2012年在美国/蒙特利尔地区

     

下个月的第三个星期二是2018-02-20

关于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