C# 检查日期时间是否与其他日期时间在同一周内
假设我在一张表中有一个日期列表。现在我想查找所有行,这些行与作为参数提供的日期在同一周内 假设我有一张桌子,上面有:C# 检查日期时间是否与其他日期时间在同一周内,c#,datetime,c#-4.0,C#,Datetime,C# 4.0,假设我在一张表中有一个日期列表。现在我想查找所有行,这些行与作为参数提供的日期在同一周内 假设我有一张桌子,上面有: 2014-09-11 2014-09-12 2014-09-15 我给这个函数一个参数2014-09-09,它必须从星期一->星期天开始看,并且意识到09-11和09-12是一周的一部分,而不是09-15 究竟如何解决这个问题? 我曾想过要核对年份、月份和周数,但你不能保证月份是一样的 那么如何解决这样的问题呢?检查DateTime.Year和Calendar.GetWeek
- 2014-09-11
- 2014-09-12
- 2014-09-15
那么如何解决这样的问题呢?检查DateTime.Year和Calendar.GetWeekOfYear(DateTime,…)。这个月不需要检查
编辑:这是错误的,但我无法删除它。请参阅下面@Sparrow的答案。使用:
公共虚拟int GetWeekOfYear(DateTime time,CalendarWeekRule规则,DayOfWeek firstDayOfWeek)
类的如果不想使用Calendar类,可以使用此函数:
public static int WeekOfYear(DateTime dt)
{
int startDays = 0;
// first day of the year
DateTime firstJanuary = new DateTime(dt.Year, 1, 1);
if (firstJanuary.DayOfWeek == DayOfWeek.Tuesday)
{
startDays = 1;
}
else if (firstJanuary.DayOfWeek == DayOfWeek.Wednesday)
{
startDays = 2;
}
else if (firstJanuary.DayOfWeek == DayOfWeek.Thursday)
{
startDays = 3;
}
else if (firstJanuary.DayOfWeek == DayOfWeek.Friday)
{
startDays = 4;
}
else if (firstJanuary.DayOfWeek == DayOfWeek.Saturday)
{
startDays = 5;
}
else if (firstJanuary.DayOfWeek == DayOfWeek.Sunday)
{
startDays = 6;
}
if (DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek == DayOfWeek.Sunday)
{
startDays++;
startDays = startDays % 7;
}
return ((dt.DayOfYear + startDays - 1) / 7) + 1;
}
DxCk的评论是有效的。即使一年中的第一周或最后一周跨越两个不同的年份,此解决方案也会起作用: 检查两个日期的一周的第一天是否在同一天。 代码如下:
private bool DatesAreInTheSameWeek(DateTime date1, DateTime date2)
{
var cal = System.Globalization.DateTimeFormatInfo.CurrentInfo.Calendar;
var d1 = date1.Date.AddDays(-1 * (int)cal.GetDayOfWeek(date1));
var d2 = date2.Date.AddDays(-1 * (int)cal.GetDayOfWeek(date2));
return d1 == d2;
}
由于接受的答案包含注释中提到的@DxCK错误,以下是我的解决方案:
public static class DateExtensions
{
private static void Swap<T>(ref T one, ref T two)
{
var temp = one;
one = two;
two = temp;
}
public static bool IsFromSameWeek(this DateTime first, DateTime second, DayOfWeek firstDayOfWeek = DayOfWeek.Monday)
{
// sort dates
if (first > second)
{
Swap(ref first, ref second);
}
var daysDiff = (second - first).TotalDays;
if (daysDiff >= 7)
{
return false;
}
const int TotalDaysInWeek = 7;
var adjustedDayOfWeekFirst = (int)first.DayOfWeek + (first.DayOfWeek < firstDayOfWeek ? TotalDaysInWeek : 0);
var adjustedDayOfWeekSecond = (int)second.DayOfWeek + (second.DayOfWeek < firstDayOfWeek ? TotalDaysInWeek : 0);
return adjustedDayOfWeekSecond >= adjustedDayOfWeekFirst;
}
}
公共静态类日期扩展
{
专用静态无效交换(参考T 1,参考T 2)
{
var-temp=1;
一等于二;
二=温度;
}
公共静态bool来自SameWeek(此DateTime第一,DateTime第二,DayOfWeek firstDayOfWeek=DayOfWeek.Monday)
{
//排序日期
如果(第一次>第二次)
{
交换(参考第一,参考第二);
}
var daysDiff=(第二个-第一个).TotalDays;
如果(daysDiff>=7)
{
返回false;
}
const int TotalDaysInWeek=7;
var调整后的DayOfWeekFirst=(int)first.DayOfWeek+(first.DayOfWeek=adjustedDayOfWeekFirst;
}
}
这里还有另一个正确的解决方案,方法略有不同。为什么不呢
bool AreFallingInSameWeek(DateTime date1, DateTime date2)
{
return date1.AddDays(-(int)date1.DayOfWeek) == date2.AddDays(-(int)date2.DayOfWeek);
}
如果您想使用星期日以外的任何一天作为一周的开始
bool AreFallingInSameWeek(DateTime date1, DateTime date2, DayOfWeek weekStartsOn)
{
return date1.AddDays(-GetOffsetedDayofWeek(date1.DayOfWeek, (int)weekStartsOn)) == date2.AddDays(-GetOffsetedDayofWeek(date2.DayOfWeek, (int)weekStartsOn));
}
int GetOffsetedDayofWeek(DayOfWeek dayOfWeek, int offsetBy)
{
return (((int)dayOfWeek - offsetBy + 7) % 7)
}
我的要求是发现DOB在本周下降。希望这有助于消除你的疑虑。该代码的基本思想如下:
private bool DatesAreInTheSameWeek(DateTime birthday)
{
if (birthday == DateTime.MinValue)
{
return false;
}
else
{
var birtdayWithCurrentYear = new DateTime(DateTime.Today.Year, birthday.Month, birthday.Day);
if (birthday.Month == 1 && DateTime.Today.Month != 1)
{
birtdayWithCurrentYear = birtdayWithCurrentYear.AddYears(1);
}
DateTime firstDayInWeek = DateTime.Today.Date;
while (firstDayInWeek.DayOfWeek != CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
firstDayInWeek = firstDayInWeek.AddDays(-1);var lastDayInWeek = firstDayInWeek.AddDays(7);
return birtdayWithCurrentYear < lastDayInWeek && birtdayWithCurrentYear >= firstDayInWeek;
}
}
private bool datesareinthesamewek(DateTime生日)
{
如果(生日==DateTime.MinValue)
{
返回false;
}
其他的
{
var birtdayWithCurrentYear=新日期时间(DateTime.Today.Year,birthday.Month,birthday.Day);
if(birthday.Month==1&&DateTime.Today.Month!=1)
{
birtdayWithCurrentYear=birtdayWithCurrentYear.AddYears(1);
}
DateTime firstDayInWeek=DateTime.Today.Date;
while(firstDayInWeek.DayOfWeek!=CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
firstDayInWeek=firstDayInWeek.AddDays(-1);var lastDayInWeek=firstDayInWeek.AddDays(7);
返回birtdayWithCurrentYear=firstDayInWeek;
}
}
查找第一个日期的开始日期和结束日期。然后检查第二个日期是否介于这两个日期之间
public static bool DateInsideOneWeek(DateTime date1, DateTime date2)
{
DayOfWeek firstDayOfWeek = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek;
DateTime startDateOfWeek = date1.Date;
while(startDateOfWeek.DayOfWeek != firstWeekDay)
{ startDateOfWeek = startDateOfWeek.AddDays(-1d); }
DateTime endDateOfWeek = startDateOfWeek.AddDays(6d);
return date2 >= startDateOfWeek && date2 <= endDateOfWeek;
}
publicstaticbooldateinsideoneweek(DateTime-date1,DateTime-date2)
{
DayOfWeek firstDayOfWeek=System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.firstDayOfWeek;
DateTime startDateOfWeek=日期1.日期;
while(startDateOfWeek.DayOfWeek!=第一个工作日)
{startDateOfWeek=startDateOfWeek.AddDays(-1d);}
DateTime endDateOfWeek=startDateOfWeek.AddDays(6d);
return Date 2>=startDateOfWeek&&Date 2将其解析为日期时间对象,并从中提取一年中的一周?参见此处:相关:根据您的区域设置,一周可以从不同的一天开始:周日和周一很常见。2015年12月31日和2016年1月1日发生在同一周但不同的年份如何?这仅适用于您希望从周日开始的一周。@OllieP你可以通过从一周中的某一天减去1
来轻松解决这个问题:date1.AddDays((int)date1.DayOfWeek-1))
。这应该是我接受的答案。我宁愿创建一个小助手方法,为我所在的工作日返回合适的数字,而不是“神奇地减去”从星期一开始,因为这要求人们知道内置枚举在星期天开始。@Sparrow,您的解决方案在星期一开始的国家/地区无法正常工作。请在2020年11月1日和2020年11月6日尝试上述代码。您应该小心在.Net core中使用这些代码,因为日期时间上的毫秒几乎总是会导致return值false,即arefillingSameWeek(DateTime.Now,DateTime.Now,DayOfWeek.Monday)将返回false,但您可以通过添加.Date来解决此问题,如:date1.AddDays(-GetOffsetedDayofWeek(date1.DayOfWeek,(int)weekStartsOn)).Date==date2.AddDays(-GetOffsetedDayofWeek(date2.DayOfWeek,(int)weekStartsOn)).Date;对于给出的两个解决方案中的第一个,您会得到false,因为它也在比较时间。只需在两个值的末尾添加.Date
,以仅比较日期,如下所示:返回日期1.AddDays(-(int)date1.DayOfWeek.Date==date2.AddDays(-(int)date2.DayOfWeek.Date;