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
我给这个函数一个参数2014-09-09,它必须从星期一->星期天开始看,并且意识到09-11和09-12是一周的一部分,而不是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在本周下降。希望这有助于消除你的疑虑。该代码的基本思想如下:

  • 将DOB更改为当年生日(例如:1988年2月24日至2018年2月24日(当年))
  • 如果brithday周包含12月和1月,则添加一年
  • 获得今天一周的第一天
  • 获取今天一周的最后一天
  • 检查当前年份的生日是否介于今天一周的第一天和最后一天之间

    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;