2009-11-03 22 views
56

Мне было интересно, если вы, ребята, знаете, как получить дату течения в понедельник в понедельник на основе сегодняшней даты?Получить дату первого понедельника недели?

т.е. 2009-11-03 прошел в и 2009-11-02 получает вернулся

/M

+1

Посмотрите на этот вопрос: http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week –

ответ

125

Это то, что я использую (вероятно, не интернационализированы):

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

Да, действительно: Не интернационализирован. Понедельник - это не всегда первый день недели. –

+15

Вы можете получить первый день недели, используя: CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek –

+10

Фактически первый день недели в соответствии с культурой не представляет интереса к этому случаю; OP хочет понедельника недели, а не в первый день недели. –

6

Что-то, как это будет работать

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

Я уверен, что есть лучше способ Тхо :)

0

Попробуйте это:

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

EDIT для полноты: перегрузки для сегодняшнего дня:

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

Почему цикл? Есть способы сделать это без цикла. См. Ответы ниже. –

53

Ответ Pondium может искать вперед в некоторых случаях. Если вы хотите только поиск в обратном направлении, я думаю, что это должно быть:

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

Это должен быть правильный ответ, поскольку он обрабатывает воскресенье, т.е. FirstDayOfWeek - понедельник, поэтому, если воскресенье - это дата ввода, она должна верните в понедельник раньше. –

+1

+1 Если «вход» - 1/1/2017 (воскресенье), этот код дает 26/12/2016 в качестве первого дня недели! Не 2/1/2017 (что дает принятый ответ!) –

+0

Он также работает 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; 

Возможно возвратит вас с понедельника. Если вы не используете культуру, где понедельник не первый день недели.

3

насчет:

CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek 

Почему бы не использовать родное решение?

+2

Вопрос заключается в том, чтобы получить конкретную дату (то есть 2015-11-20), а не тот день, который определен как первый день. –

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; 
    } 
} 

Международный. Я думаю, что расширение может быть более полезным.

Смежные вопросы