2009-03-18 82 views
33

Cách tốt nhất để tính ngày bắt đầu và ngày kết thúc của tuần trước trong C# là gì? I E. ngày 18 tháng 3 sẽ kết quả vào ngày 9 tháng 3 (thứ Hai tuần trước) và ngày 15 tháng 3 (Chủ Nhật tuần trước).Tính ngày bắt đầu và ngày kết thúc của tuần trước

Tôi đã thấy điều này được thực hiện với DayOfWeek và một tuyên bố chuyển đổi để làm việc ra một bù đắp nhưng đã tự hỏi liệu có một cách thanh lịch hơn.

+0

gì về sự phức tạp của việc tính toán tuần làm việc trước đó sau khi đóng cửa kinh doanh vào thứ Sáu, sau đó sẽ trả về tuần hiện tại rằng thứ sáu là trong? –

Trả lời

55

Bạn có thể bỏ qua vòng lặp while và sử dụng

DateTime mondayOfLastWeek = date.AddDays(-(int)date.DayOfWeek - 6); 

này giả định bạn đang sử dụng thứ hai là ngày đầu tiên trong tuần .

+2

Để trả lời câu hỏi, startOfWeek nên được đặt tên là sundayOfLastWeek. "DateTime mondayOfLastWeek = date.AddDays (- (int) date.DayOfWeek - 6);" –

+0

Cảm ơn bạn đã sửa Austin Salonen – bstoney

+4

Cách tiếp cận tốt nhất một lớp lót. Tôi nghĩ rằng sau đây sẽ làm việc bất kể ngày chạy của nó trên: mondayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek - 6); sundayOfLastWeek = DateTime.Now.AddDays (- (int) DateTime.Now.DayOfWeek); – Henryk

22
DayOfWeek weekStart = DayOfWeek.Monday; // or Sunday, or whenever 
DateTime startingDate = DateTime.Today; 

while(startingDate.DayOfWeek != weekStart) 
    startingDate = startingDate.AddDays(-1); 

DateTime previousWeekStart = startingDate.AddDays(-7); 
DateTime previousWeekEnd = startingDate.AddDays(-1); 

Đọc: Quay lại một ngày tại một thời điểm cho đến khi bắt đầu tuần này, sau đó trừ bảy để bắt đầu tuần trước.

+0

Smart !!! Một cách rất đơn giản và dễ dàng – redDragonzz

3

Sử dụng dayOfWeek sẽ là một cách để đạt được điều này:

DateTime date = DateTime.Now.AddDays(-7); 
    while (date.DayOfWeek != DayOfWeek.Monday) 
    { 
     date = date.AddDays(-1); 
    } 

    DateTime startDate = date; 
    DateTime endDate = date.AddDays(7); 
0

Bạn có thể tạo ra một phương pháp DateTime mở rộng, có thể được sử dụng với một tham số dayOfWeek:

public static class DateTimeExtension 
{ 
    public static DateTime GetPreviousWeekDay(this DateTime currentDate, DayOfWeek dow) 
    { 
     int currentDay = (int)currentDate.DayOfWeek, gotoDay = (int)dow; 
     return currentDate.AddDays(-7).AddDays(gotoDay-currentDay); 
    }   
} 

Sau đó, sử dụng nó như sau:

DateTime testDate = new DateTime(2017, 01, 21); 

Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Sunday)); 
Console.WriteLine(testDate.GetPreviousWeekDay(DayOfWeek.Saturday)); 
0

Giải pháp được chấp nhận thực sự không chính xác.

Bạn phải chuyển đổi khi tuần "ngắt", nghĩa là khi nào tuần xét đến kết thúc hoặc bắt đầu, và công thức trong giải pháp được chấp nhận thì không.

Điều này không hiển thị vào thứ Hai khi bắt đầu tuần, nhưng nhiều hơn như vậy nếu bạn sẽ xem xét thứ Năm vào cuối tuần.

công thức đúng là (đối với ngày thứ Năm khi kết thúc ngày):

DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1); 

Đối Thứ hai, -5 sẽ chuyển sang -2.

Ví dụ mã để in ra

 String s = ""; 
     DateTime date = new DateTime(2017, 1, 1); 
     for (int i = 0; i < 14; i++) 
     { 
      date = date.AddDays(1); 
      DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1); 
      DateTime mon = date.AddDays(-(int)(date.AddDays(-2).DayOfWeek) -1); 
      s += date.ToString() + " - Thu: " + thu.ToString() + " - Mon: " + mon.ToString() + "\r\n"; 
     } 
     Console.WriteLine(s); 
Các vấn đề liên quan