Как я могу получить DateTime для начала недели?

Быстрый способ (скопированный с здесь ) следующий:

def ExpMovingAverage(values, window):
    """ Numpy implementation of EMA
    """
    weights = np.exp(np.linspace(-1., 0., window))
    weights /= weights.sum()
    a =  np.convolve(values, weights, mode='full')[:len(values)]
    a[:window] = a[window]
    return a

427
задан Peter Mortensen 22 October 2011 в 09:22
поделиться

13 ответов

Используйте дополнительный метод. Они - ответ на все, Вы знаете!;)

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
}

, Который может использоваться следующим образом:

DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
674
ответ дан Garrett Stauber 22 October 2011 в 09:22
поделиться

Вы могли использовать превосходное библиотека Umbrella :

using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();

Однако они делают , кажется, сохранили в понедельник как первый день недели (см. свойство nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn), так, чтобы предыдущее локализованное решение было немного лучше. Неудачный.

Редактирование : смотря ближе на вопрос, похоже, что Зонтик мог бы на самом деле работать на тот также:

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday(); 
DateTime sunday = DateTime.Now.PreviousSunday();

, Хотя стоит отметить, что, если Вы спрашиваете в течение предыдущего понедельника в понедельник, это даст Вам семь дней назад. Но это также верно, если Вы используете BeginningOfWeek, который походит на ошибку: (.

0
ответ дан Domenic 22 October 2011 в 09:22
поделиться

Следующий метод должен возвратить DateTime, который Вы хотите. Передача в истинном в течение воскресенья, будучи первым днем недели, лжи в течение понедельника:

private DateTime getStartOfWeek(bool useSunday)
{
    DateTime now = DateTime.Now;
    int dayOfWeek = (int)now.DayOfWeek;

    if(!useSunday)
        dayOfWeek--;

    if(dayOfWeek < 0)
    {// day of week is Sunday and we want to use Monday as the start of the week
    // Sunday is now the seventh day of the week
        dayOfWeek = 6;
    }

    return now.AddDays(-1 * (double)dayOfWeek);
}
1
ответ дан firedfly 22 October 2011 в 09:22
поделиться

Это дало бы Вам полночь в первое воскресенье недели:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

Это дает Вам первый понедельник в полночь:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);
2
ответ дан Peter Mortensen 22 October 2011 в 09:22
поделиться

Это дало бы Вам в предыдущее воскресенье (я думаю):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);
8
ответ дан Tim Cooper 22 October 2011 в 09:22
поделиться

Это может быть определенным взломом, но можно бросить.DayOfWeek свойство к интервалу (это - перечисление и так как не изменили его базовый тип данных, это принимает значение по умолчанию к интервалу), и используйте это для определения предыдущего запуска недели.

кажется, что неделя, определенная в перечислении DayOfWeek, запускается в воскресенье, поэтому если мы вычтем 1 из этого значения, то это будет равно тому, сколько дней понедельник перед текущей датой. Мы также должны отобразить воскресенье (0) для равенства 7 так, учитывая 1 - 7 =-6, воскресенье отобразится на предыдущий Monday:-

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

, код в течение предыдущего воскресенья более прост, поскольку мы не должны делать этот adjustment:-

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);
9
ответ дан ljs 22 October 2011 в 09:22
поделиться

Давайте объединим безопасный от культуры ответ и дополнительный ответ метода:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
        return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
    }
}
14
ответ дан Joel Coehoorn 22 October 2011 в 09:22
поделиться

Немного более подробный и осведомленный о культуре:

System.Globalization.CultureInfo ci = 
    System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;
64
ответ дан Ryan Lundy 22 October 2011 в 09:22
поделиться

Следование за Ответом This Компиляции, используйте следующий метод для получения даты в течение любого дня недели:

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}
0
ответ дан 22 November 2019 в 23:09
поделиться

Использование Fluent DateTime :

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
36
ответ дан 22 November 2019 в 23:09
поделиться
public static System.DateTime getstartweek()
{
    System.DateTime dt = System.DateTime.Now;
    System.DayOfWeek dmon = System.DayOfWeek.Monday;
    int span = dt.DayOfWeek - dmon;
    dt = dt.AddDays(-span);
    return dt;
}
-2
ответ дан 22 November 2019 в 23:09
поделиться

Спасибо за примеры. Мне нужно было всегда использовать "CurrentCulture" в первый день недели, а для массива мне нужно было знать точный Daynumber ... так что вот мои первые расширения:

public static class DateTimeExtensions
{
    //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
    //http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
    public static DateTime StartOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }

    public static int DayNoOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return diff + 1; //Make it 1..7
    }
}
1
ответ дан 22 November 2019 в 23:09
поделиться

Это вернет даты начала и конца недели:

    private string[] GetWeekRange(DateTime dateToCheck)
    {
        string[] result = new string[2];
        TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day 
        DateTime dateRangeBegin = dateToCheck;
        DateTime dateRangeEnd = DateTime.Today.Add(duration);

        dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
        dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

        result[0] = dateRangeBegin.Date.ToString();
        result[1] = dateRangeEnd.Date.ToString();
        return result;

    }

Полный код для вычисления начала/конца недели, месяца, квартала и года я опубликовал в своем блоге. ZamirsBlog

0
ответ дан 22 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: