如何获取本周开始的 DateTime?

How can I get the DateTime for the start of the week?

提问人:GateKiller 提问时间:9/1/2008 最后编辑:Peter MortensenGateKiller 更新时间:11/10/2023 访问量:378895

问:

如何在 C# 中只知道当前时间的情况下找到一周的开始时间(周日和周一)?

像这样:

DateTime.Now.StartWeek(Monday);
C# 日期时间

评论


答:

12赞 Skizz 9/1/2008 #1

这会给你前一个星期天(我认为):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);
1赞 firedfly 9/1/2008 #2

以下方法应返回所需的 DateTime。如果 true 为 true,则为 false,表示 Monday 为假:

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);
}
11赞 ljs 9/1/2008 #3

这可能有点黑客,但您可以强制执行.DayOfWeek 属性设置为 int(它是一个枚举,由于它的基础数据类型没有更改,因此默认为 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);
930赞 Compile This 9/1/2008 #4

使用扩展方法:

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

评论

29赞 Troy 3/29/2011
您可以按如下方式简化此操作:int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
20赞 Aaron Hoffman 4/23/2012
特洛伊,如果给定的日期是星期天,而你的一周的开始是星期一,我不相信你的代码有效。它将返回 (Sunday + 1) 而不是 (Sunday - 6)
2赞 row1 9/6/2012
如果是 UTC 并且已经是一周的开始,则这不起作用,例如 这是当地时间。因此,它需要转换为本地时间或做一些更聪明的事情。如果输入是 UTC,它还需要将结果返回为 UTC。dt2012-09-02 16:00:00ZMon, 03 Sep 2012 00:00:00dt
1赞 Rawling 1/22/2013
@row1 返回等效的本地时间,并且此方法正确返回与本地时间相同的时间。如果用于显式传递 UTC 时间,则此方法将正确返回 6 天(16 小时前)作为 UTC 时间。它的工作完全符合我的预期。DateTime.Parse("2012-09-02 16:00:00Z")DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
5赞 Vincent Saelzler 5/27/2017
这有时会让我休息一天。一旦我从中剥离了时间组件,它就对我有用。我用过dtint diff = dt.Date.DayOfWeek - startOfWeek;
75赞 Jason Navarrete 9/1/2008 #5

更冗长一点,具有文化意识:

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;

评论

4赞 balexandre 2/1/2010
出现错误:今天 = 星期日;fdow = 星期一;(今天 - FDow) == -1;DateTime.Now.AddDays(-(-1))。日期 == DateTime.Now.AddDays(+1)。日期;2010 年 2 月 1 日 != 2010 年 1 月 25 日 !!
3赞 Chris S 5/15/2011
如果你在星期天尝试这个,那么它基本上是在做 addDays(0 - 1) for en-GB。所以它需要@Sarcastic的 if 语句
4赞 Hank 12/11/2012
您还可以使用当前文化,而不是像那样将其从线程中拉出来。似乎是一种奇怪的访问方式。CultureInfo.CurrentCulture
9赞 Jeppe Stig Nielsen 9/2/2013
另一个问题:给酒店打电话两次很危险。如果当前时间恰好在两次通话之间经过 24:00(或午夜 12:00),则日期将更改。Now
1赞 Mathieu Renda 7/13/2016
这个答案实际上的作用是:“在当前的 .NET 周(从星期日开始,到星期六结束,根据 DayOfWeek 枚举的编号),找到 .NET 周的哪一天,即当前区域性中一周的第一个星期”。这可能不是你想要的。
3赞 Glenn Slaven 9/1/2008 #6

这将给你一周的第一个星期日的午夜:

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);
1赞 Domenic 9/2/2008 #7

您可以使用出色的 Umbrella 库

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

但是,他们似乎确实将星期一存储为一周的第一天(请参阅属性),因此以前的本地化解决方案会更好一些。不幸。nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn

编辑:仔细观察这个问题,看起来 Umbrella 实际上也可能适用于此:

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

虽然值得注意的是,如果你在星期一要求上一个星期一,它会给你七天。但如果你使用 ,这似乎是一个错误:(,这也是正确的。BeginningOfWeek

12赞 Joel Coehoorn 9/2/2008 #8

让我们结合文化安全答案和扩展方法答案:

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

评论

13赞 hultqvist 5/4/2010
您的函数中都没有使用 dt 和 startOfWeek,我想应该使用第一个而不是 DateTime.Today
2赞 Joel Coehoorn 9/15/2011
问题的上下文是希望以与 相同的方式使用其他属性来使用 off。今天或 .现在。我同意这很尴尬,但这是所要求的。
9赞 Aaronaught 1/23/2012
我知道这是一个古老的答案,但它在很多层面上都是错误的;除了完全忽略方法参数之外,在许多情况下,数学还会导致它选择未来的日期。这应该被写成使用 而不是 ,将数学包装在 中以确保负偏移量,使用传递当前区域性的单参数方法重载作为参数,并且可能(取决于规范)强制将零偏移量强制为 7 天偏移量,因此如果已经是星期二,“上周二”今天不会返回。dtDateTime.Today(offset + 7) % 7FirstDayOfWeekstartOfWeek
40赞 Simon 9/4/2009 #9

使用 Fluent DateTime

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);

评论

36赞 Esteban Araya 5/28/2010
我不想仅仅为此而依赖。“了解你的依赖关系并杀死它们”似乎浮现在脑海中。:)
9赞 nsimeonov 4/23/2013
有没有人注意到“Fluent”是如何工作的?看看代码就知道了。它正在使用一个 do...while 循环。不想叫它名字,但如果我决定这样做,那不会令人愉快。public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
17赞 Simon 4/23/2013
@nsimeonov它是开源的。请随时提供更好的实现,而不是扔石头。
2赞 Jim G. 3/31/2016
@EstebanAraya:haneycodes.net/npm-left-pad-have-we-forgotten-how-to-program
2赞 Daniel Scott 2/19/2022
@nsimeonov 以这种方式编码 Fluent 似乎是有充分理由的。使用这种方法可以避免以星期一为FDoTW的文化边缘情况,尽管它可能效率低下。特别是一个问题:当当前日期是星期日时,必须减去 6 天才能到达一周的星期一第一天。这里的许多其他解决方案最终都会增加一天。请注意此处的评论,以回应已提出的其他方法。不过我同意,可以更有效地做到这一点。它并不像乍一看那么微不足道。
2赞 user324365 5/21/2010 #10

谢谢你的例子。我需要始终使用一周的第一天“CurrentCulture”,对于数组,我需要知道确切的日数。所以这是我的第一个扩展:

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
    }
}
0赞 Zamir 5/28/2010 #11

这将返回一周的开始和结束日期:

    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上发布了用于计算一周,月,季度和年开始/结束的完整代码

42赞 Janspeed 5/11/2012 #12

丑陋,但它至少给了正确的日期

由系统设置的周开始:

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

评论

0赞 FranzHuber23 5/6/2019
这个资源也有帮助:markb.uk/... (如果您想获得一周或一个月的第一天/最后一天)。
2赞 Blake 7/24/2020
我必须同意这是最万无一失的方法。看看其他答案遇到的所有边缘情况。我理解关于效率的论点,但最坏的情况是,你从一周的最后一天开始,必须调用 AddDays 六次才能回到起点。在最坏的情况下,这比其他解决方案多五倍,但这些解决方案还必须处理其他数值计算才能得出偏移量。除了对性能最敏感的应用外,其他所有应用的差异可能都微不足道。
3赞 2 revs, 2 users 88%yeasir007 #13

在 C# 中尝试这样做。使用此代码,您可以获得给定一周的第一个日期和最后一个日期。这里是第一天,周六是最后一天,但您可以根据自己的文化设置这两天。

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);

public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime firstDayInWeek = dayInWeek.Date;
    while (firstDayInWeek.DayOfWeek != firstDay)
        firstDayInWeek = firstDayInWeek.AddDays(-1);

    return firstDayInWeek;
}

public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime lastDayInWeek = dayInWeek.Date;
    while (lastDayInWeek.DayOfWeek != firstDay)
        lastDayInWeek = lastDayInWeek.AddDays(1);

    return lastDayInWeek;
}
5赞 Matthew Hintzen 7/8/2012 #14

将所有这些放在一起,与全球化相结合,并允许将一周的第一天指定为我们电话的一部分

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
    DayOfWeek fdow;

    if ( firstDayOfWeek.HasValue  )
    {
        fdow = firstDayOfWeek.Value;
    }
    else
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        fdow = ci.DateTimeFormat.FirstDayOfWeek;
    }

    int diff = dt.DayOfWeek - fdow;

    if ( diff < 0 )
    {
        diff += 7;
    }

    return dt.AddDays( -1 * diff ).Date;

}
125赞 Eric 1/31/2013 #15

我能想到的最快的方法是:

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

评论

3赞 Cerveser 10/9/2014
最简单的答案是最好的,这个答案很好,但取决于文化
20赞 0xDEAD BEEF 2/2/2016
在拉脱维亚,一周从星期一开始。实际上。。我总是想知道一周怎么能从星期天开始。对我来说似乎很尴尬......;)
0赞 Loligans 6/14/2016
这个解决方案很好。此外,您可以通过添加要开始的 DayOfWeek 来使一周的任何一天开始。var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);
17赞 Giovanni B 8/15/2017
此添加的代码不适用于 Threezol 描述的情况。如果您希望一周的开始时间是星期一,那么在周日,计算会为您提供即将到来的星期一,而不是上一个星期一。
8赞 Nameless 2/14/2018
是的。。对于星期天,它给出了下一个 Modnay..不是上一个:P
2赞 Andreas Kromann 3/5/2013 #16

这是一个正确的解决方案。无论一周的第一天是星期一还是星期日或其他时间,以下代码都有效。

public static class DateTimeExtension
{
  public static DateTime GetFirstDayOfThisWeek(this DateTime d)
  {
    CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
    var current = (int)d.DayOfWeek;

    var result = first <= current ?
      d.AddDays(-1 * (current - first)) :
      d.AddDays(first - current - 7);

    return result;
  }
}

class Program
{
  static void Main()
  {
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine("Current culture set to en-US");
    RunTests();
    Console.WriteLine();
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
    Console.WriteLine("Current culture set to da-DK");
    RunTests();
    Console.ReadLine();
  }

  static void RunTests()
  {
    Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
    Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
    Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
    Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
  }
}
4赞 HelloWorld 9/16/2013 #17
var now = System.DateTime.Now;

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;
6赞 Rabbex 12/6/2015 #18
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();
        }
    }
}

评论

4赞 MTCoster 12/6/2015
首先,欢迎来到社区:)这个问题已经有几个高质量的答案,其中大部分是在七年前提出这个问题时发布的。虽然尝试回答像这样的简单问题以提高您的编程能力可能是一个值得的练习,但以当前状态发布此答案并不会为问题增加任何内容。如果你的答案有什么新奇的地方,请用几句话来解释它的不同之处以及为什么这会让它变得更好。
3赞 Piotr Lewandowski 12/18/2015 #19

C# 中的模数对 -1 mod 7 不起作用(它应该是 6,但 C# 返回 -1) 所以。。。对此的“单行”解决方案将如下所示:)

private static DateTime GetFirstDayOfWeek(DateTime date)
{
    return date.AddDays(
        -(((int)date.DayOfWeek - 1) -
          (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
}
3赞 Threezool 6/19/2016 #20

我尝试了几个,但我没有在星期一开始的一周内解决问题,导致我在周日给了我下一个星期一。所以我稍微修改了一下,让它使用以下代码:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;

评论

0赞 Damian Vogel 7/11/2018
似乎“即将到来的星期一”的问题取决于文化(另见Eric的回答和Cerveser的评论)。但是,如果您不需要考虑周日(就像通常的商务约会一样),您的公式可以简化:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
0赞 Peter Mortensen 10/27/2022
你修改了什么?来自上一个答案的代码?哪个答案?
3赞 F.H. 4/28/2017 #21

周末也一样(以 Compile This 的答案风格):

    public static DateTime EndOfWeek(this DateTime dt)
    {
        int diff = 7 - (int)dt.DayOfWeek;

        diff = diff == 7 ? 0 : diff;

        DateTime eow = dt.AddDays(diff).Date;

        return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { };
    }
0赞 Mike 1/24/2018 #22

以下是一些答案的组合。它使用允许传入区域性的扩展方法。如果未传入,则使用当前区域性。这将为其提供最大的灵活性和重用性。

/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>
    date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo ?? CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

用法示例:

public static void TestFirstDayOfWeekExtension() {
    DateTime date = DateTime.Now;
    foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
        Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
    }
}
0赞 Ali Umair 1/29/2018 #23

如果你想要周六或周日或一周中的任何一天,但不超过本周(周六至周日),我给你提供了这段代码。

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
    var temp = date;
    var limit = (int)date.DayOfWeek;
    var returnDate = DateTime.MinValue;

    if (date.DayOfWeek == day) 
        return date;

    for (int i = limit; i < 6; i++)
    {
        temp = temp.AddDays(1);

        if (day == temp.DayOfWeek)
        {
            returnDate = temp;
            break;
        }
    }
    if (returnDate == DateTime.MinValue)
    {
        for (int i = limit; i > -1; i++)
        {
            date = date.AddDays(-1);

            if (day == date.DayOfWeek)
            {
                returnDate = date;
                break;
            }
        }
    }
    return returnDate;
}
13赞 George Stavrou 10/9/2018 #24

星期一

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

周日

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);

评论

1赞 qxotk 1/29/2019
我有不同的应用程序需求,但是我用它来让我继续前进。我喜欢它,因为它是最简单的,没有任何投射 - 保持相同/适当的类型。
2赞 Grant J 11/6/2019
当当天是星期天时,这不起作用。它给出的是下周一,而不是本周的开始。
0赞 George Stavrou 11/6/2019
你也复制了星期天或星期一。我有 2 个答案,一个是周一想要的,一个是周日的答案.....我刚刚测试了它,它对我来说效果很好。DateTime.Now.DayOfWeek;星期日和结果 DateTime.Now.AddDays(DayOfWeek.Sunday - DateTime.Now.DayOfWeek);{10/11/2019 4:14:55 μμ}日期: {10/11/2019 12:00:00 πμ} 天: 10 星期日一周: 星期日 DayOfYear: 314 小时: 16 种类: 本地 毫秒: 172 分钟: 14 月: 11 秒: 55 刻度: 637089992951723516 时间: {16:14:55.1723516} 年份: 2019
0赞 George Stavrou 11/6/2019
@GrantJ 你走了哪条路线???我刚刚测试过,它工作正常。
1赞 Grant J 11/8/2019
我想我现在明白了你的答案——它给了你星期一或星期日,假设你在星期日开始一周(仅适用于某些文化)。然而,问题是要求一个给你一周开始的解决方案,而不是一个给你一个星期一或星期日的解决方案,假设一周从星期日开始。
0赞 user1489673 11/28/2018 #25

我们喜欢单行:获取当前文化的一周中的第一天与当前一天之间的差异,然后从当前日期中减去天数:

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));
7赞 Muhammad Abbas 4/4/2019 #26

步骤1:

创建静态类

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

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

第 2 步:使用此类获取一周的开始和结束日期

DateTime dt = TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);

评论

2赞 mlhDev 12/24/2019
根据我编写的单元测试,我需要在周末结束。(6 - (dt.DayOfWeek - startOfWeek)) % 7
0赞 Peter Mortensen 10/27/2022
“TIMEE”这个名字有什么用?什么代码标准规定全部大写(不是反问句)?
1赞 Rowan Richards 7/30/2019 #27

根据 Compile This 的答案,使用以下方法获取一周中任何一天的日期:

public static DateTime GetDayOfWeek(DateTime dateTime, DayOfWeek dayOfWeek)
{
   var monday = dateTime.Date.AddDays((7 + (dateTime.DayOfWeek - DayOfWeek.Monday) % 7) * -1);

   var diff = dayOfWeek - DayOfWeek.Monday;

   if (diff == -1)
   {
      diff = 6;
   }

   return monday.AddDays(diff);
}

评论

0赞 daniol 9/14/2022
这种实现没有按预期工作,至少在德国文化下是这样。例如:dateTime=“2022-08-10”, dayOfWeek=“Monday” 它返回“2022-08-01”而不是“2022-08-08”。
0赞 C. Keats 5/2/2020 #28

通过这种计算方式,您可以选择一周中的哪一天表示新一周的开始(在我选择的示例中是星期一)。

请注意,对星期一的一天进行此计算将给出当前星期一,而不是前一个星期一。

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
3赞 DReact 11/10/2020 #29

我周一做了,但周日也有类似的逻辑。

public static DateTime GetStartOfWeekDate()
{
    // Get today's date
    DateTime today = DateTime.Today;
    // Get the value for today. DayOfWeek is an enum with 0 being Sunday, 1 Monday, etc
    var todayDayOfWeek = (int)today.DayOfWeek;

    var dateStartOfWeek = today;
    // If today is not Monday, then get the date for Monday
    if (todayDayOfWeek != 1)
    {
        // How many days to get back to Monday from today
        var daysToStartOfWeek = (todayDayOfWeek - 1);
        // Subtract from today's date the number of days to get to Monday
        dateStartOfWeek = today.AddDays(-daysToStartOfWeek);
    }

    return dateStartOfWeek;

}
0赞 Display Name 7/5/2022 #30

我与很多学校合作,因此正确使用星期一作为一周的第一天在这里很重要。

这里很多最简洁的答案在周日都不起作用——我们经常在周日返回明天的日期,这不利于对上周的活动进行报告。

这是我的解决方案,上周一周日返回,今天周一返回。

// Adding 7 so remainder is always positive; Otherwise % returns -1 on Sunday.
var daysToSubtract = (7 + (int)today.DayOfWeek - (int)DayOfWeek.Monday) % 7;

var monday = today
    .AddDays(-daysToSubtract)
    .Date;

请记住对“today”使用方法参数,以便它是单元可测试的!