检查日期时间是否与其他日期时间在同一周

时间:2014-09-11 19:04:48

标签: c# datetime c#-4.0

我们说我在表格中有一个日期列表。现在我想找到所有行,它们与作为参数提供的日期在同一周。

我们说我有一张桌子:

  • 2014年9月11日
  • 2014年9月12日
  • 2014年9月15日

我给这个函数提供了参数2014-09-09,它必须从周日 - >星期日看,并且意识到09-11和09-12是本周的一部分,但不是09-15。 / p>

如何解决这个问题?

我曾考虑检查年,月和周数,但你无法保证月份是一样的......

那么你如何解决这样的问题?

8 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

检查DateTime.Year和Calendar.GetWeekOfYear(DateTime,...)。无需检查月份。

编辑:这是错的,但我无法删除它。请参阅@ Sparrow的答案。

答案 2 :(得分:4)

为什么不呢?

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

答案 3 :(得分:3)

使用Calendar

public virtual int GetWeekOfYear(DateTime time,CalendarWeekRule rule,DayOfWeek firstDayOfWeek)

答案 4 :(得分:1)

我的要求是找到本周的DOB。希望这有助于您的怀疑。基本上这个代码背后的想法如下:

  1. 将DOB更改为当前年份生日(例如:24-02-1988至24-02-2018(本年度)。
  2. 如果brithday周包含dec和jan
  3. ,则添加一年
  4. 获取今天一周的第一天。
  5. 获取今天一周的最后一天。
  6. 检查当前年份的生日是否在今天的第一天和最后一天之间。

    RecyclerView

答案 5 :(得分:0)

如果您不想使用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;
}

答案 6 :(得分:0)

由于接受的答案包含评论中提及的@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;
    }
}

此处link也是{{3}}另一个正确的解决方案,方法略有不同。

答案 7 :(得分:0)

查找第一个日期的星期的开始和结束日期。然后检查第二个日期是否在这两个日期之间。

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