我如何获取一周中开始的DateTime?
我如何只知道C#中的当前时间来查找一周的开始(星期日和星期一)?
就像是:
DateTime.Now.StartWeek(Monday);
解决方案
回答
这将为我们提供前一个星期日(我认为):
DateTime t = DateTime.Now; t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);
回答
下面的方法应返回所需的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); }
回答
这可能有点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);
回答
使用扩展方法。他们是一切的答案,你知道的! ;)
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);
回答
更详细和文化意识:
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;
回答
这将使我们在一周的第一个星期日的午夜:
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);
回答
我们可以使用出色的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
,也是如此,这似乎是一个错误:(。
回答
让我们结合文化安全性答案和扩展方法答案:
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)); } }
回答
使用Fluent DateTime:
var monday = DateTime.Now.Previous(DayOfWeek.Monday); var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
回答
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; }
回答
感谢示例。我需要始终在一周的第一天使用" 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 } }
回答
这将返回一周的开始和结束日期:
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; }
我已经在博客上发布了用于计算周,月,季度和年的开始/结束的完整代码
扎米尔斯博客