2009-06-02 27 views
6

Đưa ra một đoạn thông tin lập kế hoạch chuẩn, chẳng hạn như "Thứ Ba thứ hai vào tháng 6 năm 2009" hoặc "Thứ Sáu cuối cùng của tháng 7 năm 2009", công thức đơn giản và hiệu quả nhất để dịch là gì?Công thức đơn giản để xác định ngày sử dụng tuần trong tháng?

Đầu vào:

  • w = Tuần tháng, liệt kê (1st, 2nd, thứ 3, thứ 4 hoặc cuối)
  • d = Ngày trong tuần, enum Sun qua Sat
  • m = Tháng, số nguyên
  • y = Năm, số nguyên

CHỈNH SỬA (lại) - Không quan trọng ngày nào trong tuần bắt đầu; Tôi muốn nhận được số w thứ d trong tháng cụ thể. Do đó, ngày chủ nhật thứ 2 vào tháng 6 năm 2009 là ngày 14 tháng 6, mặc dù kỹ thuật này rơi vào tuần thứ 3 của tháng 6; tương tự như ngày chủ nhật đầu tiên của tháng 6 là ngày 7 tháng 6, không phải là null/ngoại lệ.

+0

Bạn sẽ cần thêm thông tin - những gì ngày làm 'tuần' bắt đầu từ ngày, Thứ Bảy, Chủ Nhật hoặc Thứ Hai? Điều gì về tháng với năm của cùng một ngày trong tuần (không có "Thứ năm?") – mquander

+0

Đã chỉnh sửa - tuần bắt đầu vào Chủ nhật. Theo như chúng tôi không cần tuần thứ 5. –

+1

Dựa trên hai câu hỏi mẫu của bạn "Thứ Hai thứ 2 vào ngày 09 tháng 6" và "Thứ Sáu ngày 09 tháng 7" cuối cùng, không phải tuần bắt đầu vào bất kỳ ngày nào trong tuần vào ngày 1 của tháng? –

Trả lời

8

Cái gì như:

static DateTime GetDate(int year, int month, DayOfWeek dayOfWeek, 
     int weekOfMonth) { 
    // TODO: some range checking (>0, for example) 
    DateTime day = new DateTime(year, month, 1); 
    while (day.DayOfWeek != dayOfWeek) day = day.AddDays(1); 
    if (weekOfMonth > 0) { 
     return day.AddDays(7 * (weekOfMonth - 1)); 
    } else { // treat as last 
     DateTime last = day; 
     while ((day = day.AddDays(7)).Month == last.Month) { 
      last = day; 
     } 
     return last; 
    } 
} 
+0

(chỉnh sửa để xử lý "cuối cùng" qua một tuầnOfMonth <= 0) –

+0

Câu trả lời tuyệt vời một lần nữa - cảm ơn Marc! –

1

chỉnh sửa để sửa chữa lỗi khi tuần hỏi cho là tương tự như dayof tuần đầu tiên của tháng.

2nd chỉnh sửa để sửa chữa đĩa vấn đề' Marc

static DateTime GetDate(int year, int month, 
       DayOfWeek weekDay, int week) 
{ 
    DateTime first = new DateTime(year, month, 1); 
    int iDow = (int)weekday, iFirst = (int)first.DayOfWeek; 
    int adjust = (7+iDow-iFirst)%7 - 7; 
    return first.AddDays(7*week + adjust); 
} 
+0

Có nên là 7 * (tuần-1) không? Mặc dù vậy, bằng cách sử dụng công thức đó, "ngày chủ nhật đầu tiên của tháng 6 năm 2009" đi ra đến ngày 31 tháng 5 năm 2009. –

+0

tốt, không, gây ra các ngày thêm sẽ được trừ lên đến sáu ngày khi yêu cầu ngày trong tuần với giá trị enum nhỏ hơn ngày của tuần đầu tiên, nhưng đã lỗi khi ngày được yêu cầu tương tự như tháng đầu tiên ... –

+0

Với chỉnh sửa, ngày chủ nhật đầu tiên vào tháng 1 năm 2009 xuất hiện vào thứ hai thứ năm ... –

0
using System; 

namespace date_using_week_of_month 
{ 

    public class Example 
    { 
     public static DateTime WthDayDOfMonthM(int w, DayOfWeek d, DateTime month) 
     { 
      return first(d, month).AddDays(7 * (w - 1)); 
     } 

     private static DateTime first(DayOfWeek d, DateTime month) 
     { 
      DateTime first = new DateTime(
       month.Year, month.Month, 1); 
      while (first.DayOfWeek != d) 
      { 
       first = first.AddDays(1); 
      } 
      return first; 
     } 
    } 
} 
Các vấn đề liên quan