2009-11-03 42 views
56

Tôi đã tự hỏi nếu các bạn biết làm thế nào để có được ngày thứ hai của tuần thứ hai hàng tuần dựa trên ngày hôm nay?Nhận ngày Thứ Hai đầu tiên của tuần?

tức 2009/11/03 thông qua vào và 2009/11/02 được quay trở lại

/M

+1

Hãy xem câu hỏi này: http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week –

Trả lời

125

Đây là những gì tôi sử dụng (có thể không được quốc tế hóa):

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
DateTime monday = input.AddDays(delta); 
+1

Có, thực sự: Không quốc tế hóa. Thứ hai không phải lúc nào cũng là ngày đầu tiên của tuần. –

+15

Bạn có thể lấy ngày đầu tiên trong tuần bằng cách sử dụng: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek –

+10

Thực ra ngày đầu tiên trong tuần theo văn hóa là không quan tâm đến trường hợp này; OP muốn thứ hai của tuần, không phải là ngày đầu tiên của tuần. –

6

Something như thế này sẽ làm việc

DateTime dt = DateTime.Now; 
while(dt.DayOfWeek != DayOfWeek.Monday) dt = dt.AddDays(-1); 

tôi chắc chắn rằng có một nicer way tho :)

0

Hãy thử điều này:

public DateTime FirstDayOfWeek(DateTime date) 
{ 
    var candidateDate=date; 
    while(candidateDate.DayOfWeek!=DayOfWeek.Monday) { 
     candidateDate=candidateDate.AddDays(-1); 
    } 
    return candidateDate; 
} 

EDIT cho đầy đủ: tình trạng quá tải cho ngày hôm nay:

public DateTime FirstDayOfCurrentWeek() 
{ 
    return FirstDayOfWeek(DateTime.Today); 
} 
+0

Tại sao lặp lại ??, có nhiều cách để làm điều đó mà không có vòng lặp. Hãy xem câu trả lời dưới đây –

53

Câu trả lời có thể tìm kiếm Pondium Chuyển tiếp trong một số trường hợp. Nếu bạn muốn chỉ tìm kiếm Backward Tôi nghĩ rằng nó nên là:

DateTime input = //... 
int delta = DayOfWeek.Monday - input.DayOfWeek; 
if(delta > 0) 
    delta -= 7; 
DateTime monday = input.AddDays(delta); 
+3

Đây là câu trả lời đúng khi xử lý chủ nhật, tức là FirstDayOfWeek là thứ Hai, vì vậy nếu Chủ Nhật là ngày nhập trả lời thứ hai trước đó. –

+1

+1 Nếu 'đầu vào' là 1/1/2017 (ngày chủ nhật), mã này sẽ cung cấp cho ngày 26/12/2016 là ngày đầu tiên trong tuần! Không phải 2/1/2017 (câu trả lời được chấp nhận cho!) –

+0

Nó cũng hoạt động cho 01/01/2019 = 31/12/2018! –

1
var now = System.DateTime.Now; 

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date; 

lẽ sẽ trở lại cho bạn thứ hai. Trừ khi bạn đang sử dụng một nền văn hóa mà thứ hai không phải là ngày đầu tiên của tuần.

3

gì về:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 

Tại sao không sử dụng giải pháp tự nhiên?

+2

Câu hỏi đặt ra là lấy ngày cụ thể (nghĩa là 2015-11-20) không phải ngày nào được xác định là ngày đầu tiên. –

4
public static class DateTimeExtension 
{ 
    public static DateTime GetFirstDayOfWeek(this DateTime date) 
    { 
     var firstDayOfWeek = CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; 

     while (date.DayOfWeek != firstDayOfWeek) 
     { 
      date = date.AddDays(-1); 
     } 

     return date; 
    } 
} 

Quốc tế tại đây. Tôi nghĩ như là mở rộng nó có thể hữu ích hơn.

Các vấn đề liên quan