【问题标题】:Creating a week generator showing Week no, 1st day of week, last day of week of given date创建一个星期生成器,显示第几周、一周的第一天、给定日期的一周的最后一天
【发布时间】:2011-07-04 12:43:30
【问题描述】:

我正在尝试用 C# 为我的工资单程序创建一个星期生成器。我创建了一个类似的,它为给定日期创建一年中的几个月。

我希望给定日期的输出如下。例如。今天是 2010 年 7 月 4 日。

如果我选择上述日期的下一个 10 周,我希望打印以下内容:

Week 1:   F: 04/07/2011    L: 10/07/2011
Week 2:   F: 11/07/2011    L: 17/07/2011 
Week 3:   F: 18/07/2011    L: 24/07/2011 
Week 4:   F: 25/07/2011    L: 31/07/2011 
Week 1:   F: 01/08/2011    L: 07/08/2011 
Week 2:   F: 08/08/2011    L: 14/08/2011 
Week 3:   F: 15/08/2011    L: 21/08/2011 
Week 4:   F: 22/08/2011    L: 28/08/2011 
Week 5:   F: 29/08/2011    L: 31/08/2011 
Week 1:   F: 01/09/2011    L: 07/09/2011 

我希望以上内容适用于任何日期和我想要生成的任何周数。

有4个类:

程序.cs:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var dateInfos = GetDateInfo(DateTime.Now, 6);

            foreach (var item in dateInfos)
                Console.WriteLine("W: {0} F: {1} L: {2}", item.Week.ToString(), item.FirstDayOfWeek, item.LastDayOfWeek);

            Console.ReadKey();
        }

        public static IList<DatesBag> GetDateInfo(DateTime givenDate, int numberOfWeeks)
        {
            var result = new List<DatesBag>();    
            result.Add(new DatesBag                
            { 
                Week = (WeeksOfAMonth)givenDate.Day, 
                FirstDayOfWeek = Week.GetFirstDayOfWeek(givenDate), 
                LastDayOfWeek = Week.GetLastDayOfWeek(givenDate) 
            });    
            for (int i = 1; i < numberOfWeeks; i++)
            {
                givenDate = givenDate.AddDays(7);    
                result.Add(new DatesBag { Week = (WeeksOfAMonth)givenDate.Day, FirstDayOfWeek = Week.GetFirstDayOfWeek(givenDate), LastDayOfWeek = Week.GetLastDayOfWeek(givenDate) });
            }

            return result;
        }
    }
}

DatesBag.cs​​:

namespace ConsoleApplication1
{
    public class DatesBag
    {
        public WeeksOfAMonth Week { get; set; }

        public DateTime FirstDayOfWeek { get; set; }

        public DateTime LastDayOfWeek { get; set; }
    }
}

WeeksOfAMonth.cs:

namespace ConsoleApplication2
{
    public enum WeeksOfAMonth
    {
        Week1 = 1,
        Week2,
        Week3,
        Week4,
        Week5        
    }
}

Week.cs

namespace Payroll.Util.Helpers
{
    public static class Week
    {
        /// <summary>
        /// Gets the first day of the week.
        /// </summary>
        /// <param name="givenDate">The given date.</param>
        /// <returns>the first day of the week</returns>
        public static DateTime GetFirstDayOfWeek(DateTime givenDate)
        {
            return new DateTime(givenDate.Year, givenDate.Month, givenDate.Day);
        }

        /// <summary>
        /// Gets the last day of week.
        /// </summary>
        /// <param name="givenDate">The given date.</param>
        /// <returns>the last day of the week</returns>
        public static DateTime GetLastDayOfWeek(DateTime givenDate)
        {
            return GetFirstDayOfWeek(givenDate).AddDays(7).Subtract(new TimeSpan(1, 0, 0, 0, 0));
        }
    }
}

我的两个问题:

  1. 在 program.cs 中,我知道这行不正确

    Week = (WeeksOfAMonth)givenDate.Day, 
    

    如何显示正确的星期?

  2. 无论该月是否已经结束,我的 givenDate 变量都会不断增加 7 天。我希望它跳到下个月,即使该月的最后一周少于 7 天。我如何做到这一点。

任何帮助表示赞赏。对于那些在美国的人,独立日快乐。

【问题讨论】:

    标签: c# .net


    【解决方案1】:
    public static IList<DatesBag> GetDateInfo(DateTime givenDate, int numberOfWeeks)
    {
        var result = new List<DatesBag>();
    
        for (int i = 0; i < numberOfWeeks; i++)
        {
            int firstWeekDay = Week.GetFirstDayOfWeek(givenDate).Day;
    
            DatesBag datesBag = new DatesBag
                                    {
                                        Week = (WeeksOfAMonth) ((firstWeekDay / 7) + ((firstWeekDay % 7 == 0) ? 0 : 1)),
                                        FirstDayOfWeek = Week.GetFirstDayOfWeek(givenDate),
                                        LastDayOfWeek = Week.GetLastDayOfWeek(givenDate)
                                        };
            result.Add(datesBag);
            givenDate = givenDate.AddDays(datesBag.WeekLength + 1);
         }
        return result;
    }
    
    
    public class DatesBag
    {
        public WeeksOfAMonth Week { get; set; }
    
        public DateTime FirstDayOfWeek { get; set; }
    
        public DateTime LastDayOfWeek { get; set; }
    
        public int WeekLength { get { return LastDayOfWeek.Day - FirstDayOfWeek.Day; } }
    }
    
    
    public static class Week
    {
        public static DateTime GetFirstDayOfWeek(DateTime givenDate)
        {
            DateTime tmp = givenDate.Date;
            while (tmp.AddDays(-1).Month == givenDate.Month && tmp.DayOfWeek > DayOfWeek.Monday)
            {
                tmp = tmp.AddDays(-1);
            }
            return tmp;
        }
    
        public static DateTime GetLastDayOfWeek(DateTime givenDate)
        {
            DateTime tmp = givenDate.Date;
            while (tmp.AddDays(1).Month == givenDate.Month && tmp.DayOfWeek != DayOfWeek.Sunday)
            {
                tmp = tmp.AddDays(1);
            }
            return tmp;
        }
    }
    

    【讨论】:

    • 感谢您的回复。您的代码会正确处理周数。但是,它不能正确处理月末。对于使用今天日期的 10 周的示例输出,8 月的第 5 周和 9 月的第 1 周是:第 5 周:F:29/08/2011 L:04/09/2011 第 1 周:F:05/09/2011 L : 11/09/2011
    • 再次感谢。我想我没有正确地问我的问题。在 Program.cs 中,如果您从 var dateInfos = GetDateInfo(DateTime.Now, 6); 更改代码到 var dateInfos = GetDateInfo(DateTime.Now, 10);然后运行输出,您将看到倒数第二行输出(第 9 行)显示 Week 5: F: 29/08/2011 L: 04/09/2011 而它应该是 Week 5: F: 29/08/2011 L: 30/08/2011
    • Kinyanjui 它为您提供 W: Week5 F: 2011-08-29 00:00:00 L: 2011-08-31 00:00:00。您是否复制了整个代码?我也更改了 Week 类方法(GetFirstDayOfWeek 和 GetLastDayOfWeek)。
    • 也许我今天编码太久了。哈哈。你是对的,第 9 周是正确的。第 10 周(即最后一条记录)怎么样?
    • 我想我把你的问题复杂化了 - 试试 BigJump 发布的解决方案 - 看起来效果很好
    【解决方案2】:

    不是我最好的工作,但它完成了工作。

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var weekStart = DateTime.Now;
                DateTime nextWeek;
    
                for (int i = 0; i < 10; i++)
                {
                    var weekEnd = weekStart.AddDays(6);
                    if (weekEnd.Month != weekStart.Month)
                    {
                        weekEnd = new DateTime(weekStart.Year, weekStart.Month, 1).AddMonths(1).AddDays(-1);
                        nextWeek = weekEnd.AddDays(1);
                    }
                    else
                    {
                        nextWeek = weekStart.AddDays(7);
                    }
    
                    Console.WriteLine("Week {0}: F: {1} L: {2}", (weekStart.Day / 7) + 1, weekStart.ToShortDateString(), weekEnd.ToShortDateString());
    
                    weekStart = nextWeek;
                }
    
                Console.ReadKey();
            }
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 2013-11-22
      • 1970-01-01
      • 2018-07-25
      • 2016-11-29
      • 2021-08-26
      • 1970-01-01
      • 2019-08-30
      • 2018-02-09
      相关资源
      最近更新 更多