我如何获取星期初的DateTime?


469

我如何只知道C#中的当前时间来查找一周的开始(星期日和星期一)?

就像是:

DateTime.Now.StartWeek(Monday);

Answers:


746

使用扩展方法。他们是一切的答案,你知道的!;)

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

15
您可以将其简化如下: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Troy

13
特洛伊(Troy),如果给定的日期是星期日,而一周的开始是星期一,我认为您的代码不起作用。它将返回(Sunday + 1)而不是(Sunday-6)
Aaron Hoffman 2012年

1
如果dt是UTC,并且已经是一周的开始,例如在当地时间2012-09-02 16:00:00Z,则此方法无效Mon, 03 Sep 2012 00:00:00。因此,它需要转换dt为本地时间或做一些更聪明的事情。如果输入是UTC,则还需要将结果返回为UTC。
2012年

1
@ row1 DateTime.Parse("2012-09-02 16:00:00Z")返回等效的本地时间,并且此方法正确返回与本地时间相同的时间。如果您用于DateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()显式传递UTC时间,则此方法正确返回6天(早16小时)作为UTC时间。它的工作完全符合我的预期。
Rawling 2013年

1
有时对我来说这一天可能会取消。我从中删除了时间部分后,它对我有用dt。我曾经用过int diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler '17

80

我想出的最快方法是:

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

2
最简单的答案是最好的,这个方法效果很好,但是文化依赖
Cerveser 2014年

7
在拉脱维亚,每周从星期一开始..实际上..我一直想知道一周如何从星期日开始..对我来说似乎很尴尬..;)
0xDEAD BEEF 2016年

这个解决方案很好。另外,您可以通过添加要开始的DayOfWeek来开始任何一天的工作。var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek +(int)DayOfWeek.Monday);
Loligans

7
此添加的代码不适用于Threezol所描述的情况。如果您希望将一周的开始时间设为星期一,那么在星期天,计算将为您提供下一个星期一,而不是前一个。
Giovanni B

4
是的。.在星期天,它给出了下一个Modnay ..而不是上一个:P
Ajay Aradhya '18

64

更详细和文化意识:

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
出现错误:今天=周日;fdow =星期一;(今天-fdow)== -1; DateTime.Now.AddDays(-(-1))。Date == DateTime.Now.AddDays(+1).Date; 2010年1月2日!= 2010年1月25日!!
balexandre

3
如果您在星期日尝试此操作,则基本上是针对en-GB执行AddDays(0-1)。因此,它需要@Sarcastic的if语句
Chris S

3
您也可以使用CultureInfo.CurrentCulture来获取当前区域性,而不用像这样将其从线程中拉出来。似乎是一种奇怪的访问方式。
汉克2012年

7
另一个问题:Now两次致电该物业很危险。如果两个呼叫之间的当前时间恰好超过24:00(或午夜12:00),则日期将已更改。
Jeppe Stig Nielsen 2013年

1
这个答案的实际作用是:“在当前.NET周内(根据DayOfWeek枚举的编号,从周日开始到周六结束),查找.NET周中的那一天,即该周的第一天。在当前的文化中”。这可能不是您想要的。
Mathieu Renda

36

使用Fluent DateTime

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

29
我不愿为此承担依赖。似乎想到了“了解您的依赖性并杀死它们”。:)
Esteban Araya

7
有人注意到“ Fluent”如何工作吗?只需看一下代码即可。它正在使用do ... while循环。不想称它为名字,但是如果我决定这样做,那将不是一件愉快的事。 public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
nsimeonov

10
@nsimeonov,它是开源的。请随时提供更好的实施方式,而不要乱扔石头。
西蒙

12
是的,好像我在世界上所有时间都在修复世界上每个开源软件中的每个错误一样……
nsimeonov 2014年

4
我不得不发表评论,因为我抱怨使用“ do ... while”循环时大笑!搞笑!我以前从未听过其他程序员对循环感到震惊。如果/如果他意识到自己的代码实际上被编译成什么,很想看看这位小丑的面孔。
Josh Stodola

22

丑陋,但至少可以给您正确的日期

通过系统设置星期开始时间:

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

3
由于其简单性和可读性,这确实值得更多投票。
ProfK

该资源也有帮助:markb.uk/…(如果您想获得一周或一个月的第一天/最后一天)。
FranzHuber19年

13

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

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

12
函数中既没有使用dt也没有使用startOfWeek,我想应该使用第一个而不是DateTime
今天

2
问题的上下文是希望其他属性以与.Today或.Now相同的方式使用Datetime。我同意这很尴尬,但这正是所要的。
Joel Coehoorn

7
我知道这是个老答案,但是在很多层面上都是错误的。除了完全忽略方法参数外,数学还会在许多情况下使它选择将来的日期。这应该被编写为使用dt代替DateTime.Today,将数学包装为,(offset + 7) % 7以确保负偏移,使用单参数方法重载,该重载将当前区域性FirstDayOfWeek作为startOfWeek参数传递,并且可能(取决于规格)强制零偏移量到7天的偏移量,因此如果已经是星期二,则“最后一个星期二”今天不会返回。
亚罗诺(Aaronaught)2012年

10

这将为您提供前一个星期日(我认为):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);

9

这可能有点hack,但是您可以将.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);

9

对于星期一

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

周日

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

1
我有不同的应用程序需求,但是我使用它来使自己前进。我喜欢它,因为它是最简单的方法,没有任何强制转换-将操作保持在相同/适当的类型中。
qxotk

1
星期天不起作用。它给出了下一个星期一,而不是本周的开始。
Grant J

您是否还复制了星期日或星期一。我有2个答案,如果您想要星期一,一个答案,如果想要星期日,则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 DayOfWeek:周日DayOfYear:314小时:16种:当地毫秒:172分钟:14个月:11秒:55计时:637089992951723516 TimeOfDay:{16:14:55.1723516}年:2019年
George Stavrou

@GrantJ你走了哪一行???我刚刚测试过,效果很好。
乔治·斯塔夫鲁

我想第一个,与代表周日11月10日2019年一个DateTime替换为您DateTime.Now它应该给周一2019年11月4日,但它给了周一11月11日2019年,我成立了一个小提琴这里展示了它:dotnetfiddle.net/ Jw3ZiO
Grant J,

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

3
首先,欢迎来到社区:)这个问题已经有好几个高质量的答案,其中大多数是七年前问这个问题时发布的。为了提高您的编程能力,尝试回答诸如此类之类的简单问题可能是值得的练习,但将其以当前状态发布不会对问题产生任何影响。如果您的答案有些新颖,请用几句话来说明它的不同之处以及为什么这样做会更好。
MTCoster

4

通过全球化将它们放在一起,并允许指定星期几作为电话会议的一部分

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;

}

4
var now = System.DateTime.Now;

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

2

这将使您在一周的第一个星期日的午夜:

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

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

2

尝试了几次,但从星期一开始的一个星期后仍未解决问题,导致在星期日的下周一给了我。因此,我对其进行了一些修改并使其与以下代码一起使用:

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

似乎“即将到来的星期一”的问题取决于文化(请参见埃里克的回答和塞尔维瑟的评论。)但是,如果您不需要考虑星期日(与通常的商务约会一样),您的公式可以简化:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel '18

2

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

(6 - (dt.DayOfWeek - startOfWeek)) % 7对我编写的单元测试而言,我必须在周末结束。
mlhDev

1

下面的方法应返回所需的DateTime。如果星期天是一周的第一天,则传递true,星期一传递false:

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

感谢您的示例。我需要始终在一周的第一天使用“ 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

似乎没有人正确回答这个问题。如果有人需要,我将在此处粘贴我的解决方案。不管一周的第一天是星期一,星期日还是其他时间,下面的代码都可以工作。

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

1

C#中的Modulo不适用于-1mod7(应为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));
    }

1

周末也一样(以@Compile的形式给出):

    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

您可以使用出色的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();

尽管值得注意的是,如果您在星期一要求上一个星期一,它将给您7天的时间。但是,如果您使用BeginningOfWeek,也是如此,这似乎是一个错误:(。


0

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

    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
    namespace DateTimeExample
    {
        using System;

        public static class DateTimeExtension
        {
            public static DateTime GetMonday(this DateTime time)
            {
                if (time.DayOfWeek != DayOfWeek.Monday)
                    return GetMonday(time.AddDays(-1)); //Recursive call

                return time;
            }
        }

        internal class Program
        {
            private static void Main()
            {
                Console.WriteLine(DateTime.Now.GetMonday());
                Console.ReadLine();
            }
        }
    } 

您可以扩展答案以包含代码说明吗?它对读者的帮助超出了您的想象。
gunr2171 2014年

使用递归是非常差的实现。仅仅因为您可以使用递归并不意味着您应该这样做。与此处提供的其他解决方案相比,它会更慢并且占用更多内存。
mikecamimo

0

这是一些答案的组合。它使用一种扩展方法,该方法允许传入区域性,如果不传入,则使用当前区域性。这将使其具有最大的灵活性和可重复使用性。

/// <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

如果您想要星期六或星期天或一周中的任何一天但不超过当前星期(周六至周日),则可以使用这段代码。

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

0

我们喜欢单线:获取当前区域性的第一天与当前天之间的差,然后从当前天中减去天数

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));

0

从“编译此答案”开始,使用以下方法获取星期几的日期:

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

尝试创建一个使用递归的函数。DateTime对象是一个输入,函数返回一个新的DateTime对象,该对象代表一周的开始。

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }

尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
David Buck

0

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

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

//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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.