【问题标题】:How to find the date range of the past week? Sunday to Saturday but should not exceed the month it belongs to如何找到过去一周的日期范围?周日至周六,但不得超过所属月份
【发布时间】:2014-09-02 03:41:52
【问题描述】:

我需要一个算法来获取从 星期日到星期六的过去一周的日期。

应用程序将在每个星期一运行

示例:今天的日期是 2014 年 9 月 1 日(星期一)
结果应该是: 8 月 24 日(星期日)- 8 月 30 日(星期六)
但由于 8 月 31 日是 8 月的最后一天,因此应该包括在内。

另一个示例:2014 年 10 月 6 日(星期一)
结果应该是:10 月 1 日(星期三)- 4 日(星期六)

所以基本上,它应该考虑输出应该是它所属的月份的范围。我们不能让月份相互交叉。我将非常感谢我能得到的所有帮助。谢谢!

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这应该是您正在寻找的:

    public static class Week
    {
        public static IEnumerable<DateTime> UpTo(DateTime upTo)
        {
            var lastMonday = upTo.DayOfWeek == DayOfWeek.Sunday
                ? upTo.AddDays(-6)
                : upTo.AddDays(-(int) upTo.DayOfWeek + 1);
            var lastSunday = lastMonday.AddDays(-1);
            var sundayBefore = lastSunday.AddDays(-7);
    
            var firstDayOfMonth = new DateTime(lastSunday.Year, lastSunday.Month, 1);
            var startDay = firstDayOfMonth >= sundayBefore ? firstDayOfMonth : sundayBefore;
    
            for (var day = startDay; day < lastSunday; day = day.AddDays(1))
                yield return day;
        }
    }
    

    我认为代码相当不言自明-也许唯一不太清楚的是我计算lastMonday的那一行-为此,您必须知道DayOfWeek是一个枚举,其中Monday是@ 987654325@ - 所以我得到一个代表星期几的数字并相应地减去一天。 可悲的是,我首先错过了一个边缘情况:Sunday 为 0,因此如果您从星期日开始,这将在 next 星期一得到 - 这就是额外检查的原因 - 以防万一你不能保证给一个星期一规则。

    这里有两个 Xunit 测试用例检查您的标准:

    [Fact]
    public void SepTest()
    {
        var sunday = new DateTime(2014, 8, 24);
        var expected = Enumerable.Range(0, 7).Select(d => sunday.AddDays(d));
    
        var week = Week.UpTo(new DateTime(2014, 9, 1));
        Assert.Equal(expected, week);
    }
    
    [Fact]
    public void OctTest()
    {
        var wednesday = new DateTime(2014, 10, 1);
        var expected = Enumerable.Range(0, 4).Select(d => wednesday.AddDays(d));
    
        var week = Week.UpTo(new DateTime(2014, 10, 6));
        Assert.Equal(expected, week);
    }
    
    [Fact]
    public void Day_EdgeCase()
    {
        var sunday = new DateTime(2014, 8, 24);
        var expected = Enumerable.Range(0, 7).Select(d => sunday.AddDays(d));
    
        var week = Week.UpTo(new DateTime(2014, 9, 7));
        Assert.Equal(expected, week);
    }
    

    【讨论】:

    • 你能告诉我应该传递什么作为“upTo”吗?是 DateTime.Today 吗?我还需要的是范围的开始日期和结束日期。不是整个范围。感谢您的帮助。
    • 你传入你的“星期一”(或任何其他日期/时间) - 该算法将产生你的一天之前一周的所有天(就像你想要的那样) - 有看看答案末尾的测试,例如用法
    • 如果您需要某种字符串,而我误解了您的答案,您可以在我返回的枚举中取第一天和最后一天,并按照您的意愿格式化;)
    • 太棒了!像魅力一样工作!
    • 嗨,如果我们发现枚举中的最后一天接近月底,我们能否添加一个逻辑。示例是 8 月 30 日,星期六,但旁边是 8 月 31 日,我们也需要将 8 月 31 日添加到范围中。
    【解决方案2】:

    这是我写的可能不太好,但可能对你有帮助。

    DateTime currentDate = DateTime.Now;
        //currentDate = DateTime.Parse("9/8/2014");       //Just for test.
    
        List<PastWeekDays> list = new List<PastWeekDays>();
        //Started loop from 2 beacause it will pick current datetime every monday,so 2 days ago will be saturday.
        for (int i =2; i < 9; i++)
        {
            DateTime lastDate = currentDate.AddDays(-double.Parse((i).ToString()));
            if (lastDate.Month != currentDate.Month)
                break;
            PastWeekDays day = new PastWeekDays();
            day.Date = lastDate.Day.ToString();
            day.DayName = lastDate.DayOfWeek.ToString();
            list.Add(day);
        }
    
    //This is custom class you may not need it.
    public class PastWeekDays
    {
    public string Date { get; set; }
    public string DayName { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多