簡體   English   中英

創建一個星期生成器,顯示第幾周、一周的第一天、給定日期的一周的最后一天

[英]Creating a week generator showing Week no, 1st day of week, last day of week of given date

我正在嘗試在 C# 中為我的工資單創建一個星期生成器。 我創建了一個類似的,它為給定日期創建一年中的幾個月。

對於給定的日期,我希望我的 output 如下所示。 EG Today 是 2010 年 7 月 4 日。

如果我 select 想要在上述日期的接下來的 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        
    }
}

周.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));
        }
    }
}

我的2個問題:

  1. 在 program.cs 中,我知道這一行是不正確的

    Week = (WeeksOfAMonth)givenDate.Day,

    如何顯示正確的星期?

  2. 無論該月是否已經結束,我的 givenDate 變量都會持續增加 7 天。 我希望它跳到下個月,即使該月的最后一周少於 7 天。 我如何做到這一點。

任何幫助表示贊賞。 對於那些在美國的人,獨立日快樂。

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

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

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

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM