当前位置:  开发笔记 > 编程语言 > 正文

如何获得本周开始的DateTime?

如何解决《如何获得本周开始的DateTime?》经验,为你挑选了10个好方法。



1> Compile This..:

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

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


您可以按如下方式简化:`int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;`
特洛伊,如果给定日期是星期日,而你的星期一是星期一,我不相信你的代码有效.它将返回(星期日+ 1)而不是(星期日 - 6)

2> Eric..:

我能想出的最快方法是:

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


在拉脱维亚周从星期一开始......实际上......我一直想知道星期天一周怎么开始......对我来说似乎很尴尬..;)
这个添加的代码不适用于Threezol描述的情况.如果您希望本周的开始时间是星期一,那么在星期日计算会给出即将到来的星期一,而不是之前的星期一.
是的..对于星期天,它给出了下一个Modnay ..而不是之前的:P
最简单的答案是最好的,这个答案很好,但文化依赖

3> Jason Navarr..:

更加冗长和文化意识:

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;


另一个问题:两次调用"Now"属性是危险的.如果当前时间恰好在两次通话之间的24:00(或午夜12:00)通过,则日期将发生变化.
这有一个错误:今天=星期天; fdow =星期一; (今天 - fdow)== -1; DateTime.Now.AddDays( - ( - 1)).Date == DateTime.Now.AddDays(+1).Date; 01-02-2010!= 25-01-2010 !!
你也可以使用`CultureInfo.CurrentCulture`来获取当前的文化,而不是像那样把它拉出来.看起来像是一种奇怪的访问方式.
如果你在星期天试试这个,那么它基本上是为en-GB做AddDays(0-1).所以它需要@Sarcastic的if声明

4> Simon..:

使用Fluent DateTime:

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


我不想为此承担依赖.似乎想到了"了解你的依赖并杀死它们".:)
是的,就好像我一直在世界各地修复世界上每个开源软件中的每一个错误......
@nsimeonov它是开源的.请随意提供更好的实施,而不是扔石头.
有没有人注意到"Fluent"如何运作?只需看看代码.它正在使用do ... while循环.不想叫它的名字,但如果我决定这样做会不愉快.`public static DateTime Previous(此DateTime start,DayOfWeek day){do {start = start.PreviousDay(); } while(start.DayOfWeek!= day); 回归开始; }
我不得不发表评论,因为我对使用"do ... while"循环的投诉大笑不已!爆笑!我以前从未听过另一个程序员对循环感到不寒而栗.当他/他是否意识到他的代码实际编译成什么时,他会喜欢看到这个小丑的脸.

5> 小智..:

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

按系统设置的周开始:

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


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

6> Joel Coehoor..:

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

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


你的函数中既没有dt也没有startOfWeek,我想第一个应该用来代替DateTime.Today
我知道这是一个古老的答案,但在很多层面都是错的; 除了完全忽略方法参数之外,数学将使它在许多情况下选择*future*date.这应该写成使用`dt`代替`DateTime.Today`,将数学包装在`(offset + 7)%7`中以确保负偏移,使用单参数方法*overload*将当前文化的`FirstDayOfWeek`作为`startOfWeek`参数传递,并且可能(取决于规范)将零偏移强制为7天偏移,以便"如果已经是星期二","上周二"今天不会返回.
该问题的上下文是希望以与.Today或.Now相同的方式使用Datetime之外的其他属性.我同意这很尴尬,但这就是要求的.

7> ljs..:

这可能是一个黑客,但你可以将.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);



8> Skizz..:

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

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



9> 小智..:

对于星期一

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

周日

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



10> 小智..:
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();
        }
    }
}


首先,欢迎来到社区:)这个问题已有几个高质量的答案,其中大部分都是在七年前提出问题时发布的.尽管尝试回答诸如此类之类的简单问题以提高您的编程能力可能是一项值得的练习,但在当前状态下发布此答案并不会增加任何问题.如果你的答案有一些新颖的东西,请用几句话来解释它是如何不同以及为什么它会变得更好.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有