Как я могу получить DateTime для начала недели? - PullRequest
415 голосов
/ 01 сентября 2008

Как узнать начало недели (как в воскресенье, так и в понедельник), зная только текущее время в C #?

Что-то вроде:

DateTime.Now.StartWeek(Monday);

Ответы [ 29 ]

658 голосов
/ 01 сентября 2008

Используйте метод расширения. Знаете, они ответ на все вопросы! ;)

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);
65 голосов
/ 30 января 2013

Самый быстрый способ, которым я могу придумать, это:

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

Если вы хотите, чтобы любой другой день недели был вашей начальной датой, все, что вам нужно сделать, это добавить значение DayOfWeek к концу

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday);
62 голосов
/ 01 сентября 2008

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

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;
36 голосов
/ 04 сентября 2009

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

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
17 голосов
/ 11 мая 2012

Безобразно, но, по крайней мере, дает правильные даты назад

С началом недели, установленным системой:

    public static DateTime FirstDateInWeek(this DateTime dt)
    {
        while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
            dt = dt.AddDays(-1);
        return dt;
    }

Без:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }
14 голосов
/ 02 сентября 2008

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

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));
    }
}
9 голосов
/ 01 сентября 2008

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

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

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

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

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);
8 голосов
/ 01 сентября 2008

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

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);
6 голосов
/ 09 октября 2018

Для понедельника

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

Для воскресенья

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);
5 голосов
/ 05 декабря 2015
using System;
using System.Globalization;

namespace MySpace
{
    public static class DateTimeExtention
    {
        // ToDo: Need to provide culturaly neutral versions.

        public static DateTime GetStartOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
        }

        public static DateTime GetEndOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.GetStartOfWeek().AddDays(6);
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
        }

        public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetStartOfWeek();
        }

        public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetEndOfWeek();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...