2010-11-09 46 views

回答

0
Calendar cal = Calendar.getInstance(); 
int dayofweek = cal.get(Calendar.DAY_OF_WEEK); 

這應該做你想做的。
編輯: 多帶些計算步驟,你可以有結果:)(對不起,迷惑你的標題)

1
public static Date getDate(int day, int weekNo, int month, int year) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.DATE,1); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.MONTH, month); 
    for (int i = 0; i < 31; i++) { 
     if (cal.get(Calendar.WEEK_OF_MONTH) == weekNo 
       && cal.get(Calendar.DAY_OF_WEEK) == day) { 
      return cal.getTime(); 
     } 
     cal.add(Calendar.DATE,1); 
    } 
    return null; 
    } 

調用代碼

System.out.println(""+getDate(Calendar.MONDAY, 2, Calendar.DECEMBER,2010)); 

輸出

Mon Dec 06 15:09:00 IST 2010 
+0

我格式化了代碼並修復了語法錯誤。但是仍然有一個巨大的bug,你應該修復(提示:只是嘗試運行這個) – 2010-11-09 09:25:23

+0

@seanizer謝謝,更新的代碼。 – 2010-11-09 09:34:43

+0

Joda時間不僅更好:JODA時間岩石日期/時間操作 – iirekm 2010-11-09 13:31:19

5

這裏有一個工具方法,這樣做,使用DateUtilsApache Commons/Lang

/** 
* Get the n-th x-day of the month in which the specified date lies. 
* @param input the specified date 
* @param weeks 1-based offset (e.g. 1 means 1st week) 
* @param targetWeekDay (the weekday we're looking for, e.g. Calendar.MONDAY 
* @return the target date 
*/ 
public static Date getNthXdayInMonth(final Date input, 
    final int weeks, 
    final int targetWeekDay){ 

    // strip all date fields below month 
    final Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH); 
    final Calendar cal = Calendar.getInstance(); 
    cal.setTime(startOfMonth); 
    final int weekDay = cal.get(Calendar.DAY_OF_WEEK); 
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay); 
    return modifier > 0 
     ? DateUtils.addDays(startOfMonth, modifier) 
     : startOfMonth; 
} 

測試代碼:

// Get this month's third thursday 
System.out.println(getNthXdayInMonth(new Date(), 3, Calendar.THURSDAY)); 

// Get next month's second wednesday: 
System.out.println(getNthXdayInMonth(DateUtils.addMonths(new Date(), 1), 
    2, 
    Calendar.WEDNESDAY) 
); 

輸出:

週四11月18日00:00:00 CET 2010
週三08年12月CET 00:00:00 2010


而且這裏有一個JodaTime版本相同的代碼(我以前從未使用過JodaTime,因此可能有更簡單的方法):

/** 
* Get the n-th x-day of the month in which the specified date lies. 
* 
* @param input 
*   the specified date 
* @param weeks 
*   1-based offset (e.g. 1 means 1st week) 
* @param targetWeekDay 
*   (the weekday we're looking for, e.g. DateTimeConstants.MONDAY 
* @return the target date 
*/ 
public static DateTime getNthXdayInMonthUsingJodaTime(final DateTime input, 
    final int weeks, 
    final int targetWeekDay){ 

    final DateTime startOfMonth = 
     input.withDayOfMonth(1).withMillisOfDay(0); 
    final int weekDay = startOfMonth.getDayOfWeek(); 
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay); 
    return modifier > 0 ? startOfMonth.plusDays(modifier) : startOfMonth; 
} 

測試代碼:

// Get this month's third thursday 
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime(), 
    3, 
    DateTimeConstants.THURSDAY)); 

// Get next month's second wednesday: 
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime().plusMonths(1), 
    2, 
    DateTimeConstants.WEDNESDAY)); 

輸出:

2010-11-18T00:00:00.000 + 01:00
2010-12-08T00:00:00.000 + 01: 00

0

TL;博士

LocalDate firstFridayThisMonth = 
    LocalDate.now(ZoneId.of("America/Montreal")) 
      .with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY)) 

使用java.time

其他答案現在已過時。麻煩的舊日期時間類(DateCalendar等)現在是legacy,由java.time類代替。

LocalDate

LocalDate類表示沒有時間一天和不同時區的日期,唯一的價值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

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

TemporalAdjuster

TemporalAdjuster界面提供了操作日期時間值。 java.time類使用不可變對象,所以結果始終是一個新的對象,其值基於原始對象。

TemporalAdjusters類(注意複數名稱)提供了幾個方便的實現。其中包括月內獲得序號的日期:firstInMonth(),lastInMonth()dayOfWeekInMonth()。所有這些都採用了一個DayOfWeek枚舉對象的參數。

LocalDate firstFridayOfThisMonth = 
    today.with(
     TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY) 
    ) 
; 

......還有......

LocalDate secondMondayOfThisMonth = 
    today.with(
     TemporalAdjusters.dayOfWeekInMonth(2 , DayOfWeek.MONDAY) 
    ) 
; 

......還有......

LocalDate thirdWednesdayOfNextMonth = 
    today.plusMonths(1) 
     .with( 
      TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.WEDNESDAY) 
     ) 
; 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

+0

@MoinuddinQuadri我經常關閉問題作爲重複,特別是日期時間問題。我邀請你也這樣做。然而,這種情況*不是重複的。雖然這兩個分享月份中序數的主題,但它們並不相同。另一個問題適用於Android。另一個問題涉及循環和收集一系列日期。另一個問題涉及'EnumSet','List'和'YearMonth',這裏沒有提到。本答案顯示了多個TemporalAdjusters,另一個只有一個。我會複製粘貼一些樣板文件,但不是完整的答案。 – 2017-01-31 21:44:15

相關問題