[英]How to get the date of a given day in a specific week?
我想获取给定星期几的日期。 星期由输入的日期决定。
例如,如果我想要以下日期的星期五:
06/27/2018
07/04/2018
07/07/2018
我期望作为结果:
06/29/2018
07/06/2018
07/06/2018
在此,星期定义为星期一至星期日。
您可以根据DayOfWeek
通过一些聪明的数学来做到这一点:
public DateTime GetDay(DateTime source, DayOfWeek dayOfWeek,
DayOfWeek weekStartsOn = DayOfWeek.Monday)
{
var offset = (int)source.DayOfWeek - (int)weekStartsOn;;
if(offset < 0)
{
offset = offset + 7;
}
return source.AddDays(-offset + (int)dayOfWeek - (int)weekStartsOn);
}
并像这样使用它:
var someDate = ...; //Get a date from somewhere
var friday = GetDay(someDate, DayOfWeek.Friday);
var monday = GetDay(someDate, DayOfWeek.Monday);
如果您的一周从星期日开始,则只需使用可选的第三个参数,例如:
var friday = GetDay(someDate, DayOfWeek.Friday, DayOfWeek.Sunday);
对DavidG答案的当前版本的修改:
static DateTime GetDay(DateTime source, DayOfWeek dayOfWeek)
{
const int offsetSinceMondayIsFirstDayOfWeek = 7 - (int)DayOfWeek.Monday;
return source.AddDays(((int)dayOfWeek + offsetSinceMondayIsFirstDayOfWeek) % 7
- ((int)source.DayOfWeek + offsetSinceMondayIsFirstDayOfWeek) % 7);
}
这考虑到询问者将星期一视为一周的第一天。 如果你想周六周的第一天,只需更换Monday
与Saturday
以上。
在特殊情况下,您将星期日视为一周的第一天,它简化为DavidG的原始方法:
static DateTime GetDay(DateTime source, DayOfWeek dayOfWeek)
{
return source.AddDays((int)dayOfWeek - (int)source.DayOfWeek);
}
因为BCL的DayOfWeek
枚举类型已经在Saturday
( = 6
)和Sunday
( = 0
)之间“环绕”。
在http://chartsbin.com/view/41671上,有一张世界地图,显然显示了在不同地区中一周的第一天。
public void TestMethod1 ( )
{
DateTime date = DateTime.Now;
DateTime friday = date.AddDays( (int)DayOfWeek.Friday - (int)date.DayOfWeek );
Console.WriteLine( friday.ToString( ) );
}
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
DateTime dateValue = new DateTime(2008, 6, 11);
Console.WriteLine(dateValue.ToString("ddd",
new CultureInfo("fr-FR")));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.