如何使用java 1.6获取当年每个月的第1和第3个星期三的所有日期

时间:2014-06-23 12:41:29

标签: java date calendar

本年度即2014年。从1月1日开始,我必须在截止日期为12月31日的每个月的第1和第3个星期三。我使用的是java版本1.6

我不知道如何得到这个。

3 个答案:

答案 0 :(得分:2)

回答NimChimpsky对这个问题的评论。使用Java8之前的日期和日历API,以下是解决方案:

for(int month = Calendar.JANUARY; month <= Calendar.DECEMBER; month++) {

    GregorianCalendar c = new GregorianCalendar(2014, month, 1);

    c.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
    c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
    System.out.println("First Wednesday: " + c.getTime());

    c.set(Calendar.DAY_OF_WEEK_IN_MONTH, 3);
    System.out.println("Third Wednesday: " + c.getTime());
    System.out.println("---");

}

我实际上没有尝试过(代码可能不正确),但在Java 8中使用新的日期和时间API会是类似的:

for(Month month : Month.values()) {

    LocalDate ld = 
        LocalDate.of(2014, month, 1)
        .with(ChronoField.ALIGNED_WEEK_OF_MONTH, 1)
        .with(ChronoField.DAY_OF_WEEK, DayOfWeek.WEDNESDAY.getValue());

    System.out.println("First Wednesday: " + ld);

    ld = ld.with(ChronoField.ALIGNED_WEEK_OF_MONTH, 3);

    System.out.println("Third Wednesday: " + ld);
    System.out.println("---");

}

答案 1 :(得分:1)

伪代码,应该让你开始使用jodatime:

LocalDate dt = new LocalDate(2014, 1, 1); // 1st january

for(loop 12 months){

  now loop again to find 3rd wednesday
   while(count < 4) {
        d = d.plusDays(1);
        if(d.getDayOfWeek() != DateTimeConstants.WEDNESDAY){
          count++
        }
      // now based on count save in hashmap, 1 = 1st, 3 = 3rd for each month

    }
d.plusMonth(1);
}

这里是新的java 8数据时间:

for(loop through months){
        LocalDate date = LocalDate.of(2014, month, 01);
        TemporalAdjuster adj = TemporalAdjusters.next(DayOfWeek.WEDNESDAY);
        LocalDate nextWed = date.with(adj);
        LocalDate secondWed = nextWed.with(adj);
        LocalDate thirdWed = secondWed.with(adj);
        // save in map
}

答案 2 :(得分:0)

这是我对收集当年每个月的第一个和第三个星期三的问题的看法。

时区

请注意,与其他答案的一个重要区别是time zone。请记住,在巴黎新的一天凌晨,蒙特利尔的日期仍然是“昨天”,即前一天。因此,确定当前日期需要一个时区。

如果省略时区,则根据JVM的当前默认时区获取日期。因此,您的代码会因运行的计算机以及当前的操作系统和操作系统而异。 JVM设置。最好通过DateTimeZone定义的proper time zone name对象指定您的预期/预期时区。

LOCALDATE

Joda-Time(如java.time)提供了一个LocalDate类来表示没有任何时间或时区的仅限日期的值。

Joda-Time可以使用withDayOfWeek方法跳转到星期的另一天。这种方法并不总是及时推进。在星期一至星期日的ISO 8601标准周之后,如果需要,该方法可以在周一或之后的前几天返回。在我们的情况下,这意味着对于星期四到星期日的任何一年中的任何一天,我们需要跳到下一周,以避免前一年的早些时候去取星期三。要在下面的代码中尝试此行为,请将LocalDate.now调用更改为new LocalDate( 2013, 1, 1 )并更改年份。

约达时间

以下是使用Joda-Time 2.4。

的一些示例代码

我在2013年,2014年和2015年测试了这段代码。这些都是方便的年份,因为一年的第一天分别是周二,周三和周四。

// Collection to store our found Wednesdays.
List<LocalDate> list = new ArrayList<>( 24 ); // Two wednesdays for each of 12 months is 24.

// Get first day of the year.
DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
LocalDate firstOfYear = LocalDate.now( timeZone ).monthOfYear().withMinimumValue().dayOfMonth().withMinimumValue();

// Move from first day of the year to first Wednesday of that first month of year.
// Joda-Time follows ISO 8601 in defining the week to be MONDAY-SUNDAY.
LocalDate firstWedOfMonth;
if ( firstOfYear.getDayOfWeek() > DateTimeConstants.WEDNESDAY ) {
    firstWedOfMonth = firstOfYear.plusWeeks( 1 ).withDayOfWeek( DateTimeConstants.WEDNESDAY ); // Jump a week forward to avoid getting dates from prior year.
} else { // Else the first of year is on the target day-of-week or later in the week.
    firstWedOfMonth = firstOfYear.withDayOfWeek( DateTimeConstants.WEDNESDAY ); // Returns the same local date if already on a Wednesday.
}

// Capture first and third Wednesdays, then move on to next month, and repeat until past the end of year.
do {
    int month = firstWedOfMonth.getMonthOfYear();
    list.add( firstWedOfMonth );
    list.add( firstWedOfMonth.plusWeeks( 2 ) ); // Get 2nd Wednesday of month.
    // Move on to next month.
    do {
        firstWedOfMonth = firstWedOfMonth.plusWeeks( 1 );
    } while ( month == firstWedOfMonth.getMonthOfYear() );
} while ( firstWedOfMonth.getYear() == firstOfYear.getYear() );

转储到控制台。

System.out.println( "list: " + list );

跑步时。

List: [2014-01-01, 2014-01-15, 2014-02-05, 2014-02-19, 2014-03-05, 2014-03-19, 2014-04-02, 2014-04-16, 2014-05-07, 2014-05-21, 2014-06-04, 2014-06-18, 2014-07-02, 2014-07-16, 2014-08-06, 2014-08-20, 2014-09-03, 2014-09-17, 2014-10-01, 2014-10-15, 2014-11-05, 2014-11-19, 2014-12-03, 2014-12-17]