本年度即2014年。从1月1日开始,我必须在截止日期为12月31日的每个月的第1和第3个星期三。我使用的是java版本1.6
我不知道如何得到这个。
答案 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对象指定您的预期/预期时区。
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]