首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >日期和时间计算器

日期和时间计算器
EN

Stack Overflow用户
提问于 2018-04-17 04:27:40
回答 1查看 96关注 0票数 0

我希望能在我一直在做的事情上得到一些帮助。我有一个ASP.NET网络表单,试图成为一个计算器,现在我有日期和日子的一周排序,以及其他形式的其他部分工作。现在我需要在这份表格上加上公众假期。

我有一个数组保存日期,如果我放置任何类型的日期范围,我就会得到完整的计数,就好像它计算了整整一年一样。

其目的是阅读日期愤怒和选择假日在所述日期愤怒和只显示日期,e.g.over,两年,计数应该是双倍。

我肯定这很简单,我只是没看到而已。

代码语言:javascript
复制
public class Program
{
    public static void Main()
    {

        DisplayDayInfo(new DateTime(2018, 01, 01), new DateTime(2019, 01, 01));

        // Show info for April 2018
        //DisplayDayInfo(new DateTime(2018, 04, 01), new DateTime(2018, 05, 01));
    }

    private static int GetDayCount(IEnumerable<DateTime>dates, DayOfWeek dayOfWeek)
    {
        return dates == null ? 0 : dates.Count(date => date.DayOfWeek == dayOfWeek);
    }

    private static int GetHoliDayCount(IEnumerable<DateTime> holiday, DayOfWeek dayOfWeek)
    {
            DateTime[] holidayState = new DateTime[]
            {
                new DateTime(DateTime.Now.Year, 1, 1),
                new DateTime(DateTime.Now.Year, 1, 26),
                new DateTime(DateTime.Now.Year, 3, 30),
                new DateTime(DateTime.Now.Year, 3, 31),
                new DateTime(DateTime.Now.Year, 4, 1),
                new DateTime(DateTime.Now.Year, 4, 2),
                new DateTime(DateTime.Now.Year, 4, 25),
                new DateTime(DateTime.Now.Year, 5, 7),
                new DateTime(DateTime.Now.Year, 8, 15),
                new DateTime(DateTime.Now.Year, 9, 1),
                new DateTime(DateTime.Now.Year, 12, 25),
                new DateTime(DateTime.Now.Year, 12, 26)
            };

        return holiday == null ? 0 : holidayState.Count(date => date.DayOfWeek == dayOfWeek);

    }

    private static void DisplayDayInfo(DateTime fromDate, DateTime toDate)
    {
        var numDays = toDate.Subtract(fromDate).Days;

        Console.WriteLine("Total number of days from {0} to {1}: {2}\n",fromDate.ToShortDateString(), toDate.ToShortDateString(), numDays);

        var dates = Enumerable.Range(0, numDays).Select(days => fromDate.AddDays(days)).ToArray();

        var holiday = Enumerable.Range(0, numDays).Select(days => fromDate.AddDays(days)).ToArray();


        foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek)))
        {

            Console.WriteLine("{0} {1} ", dayOfWeek, GetDayCount(dates, dayOfWeek));
        }
        Console.WriteLine("****************************************************");

        foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek)))
        {

            Console.WriteLine("{0} {1} ", dayOfWeek, GetHoliDayCount(holiday, dayOfWeek));
        }
    }
}

https://dotnetfiddle.net/XjoCpf

任何帮助都可以,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-17 05:02:31

我根据您的意图更改了您的方法的一些实现:

代码语言:javascript
复制
    private static DateTime? GetHoliDayCount(DateTime holiday)
    {
        DateTime? holidayToReturn = null ;
        DateTime[] holidayState = new DateTime[]
        {
            new DateTime(DateTime.Now.Year, 1, 1),
            new DateTime(DateTime.Now.Year, 1, 26),
            new DateTime(DateTime.Now.Year, 3, 30),
            new DateTime(DateTime.Now.Year, 3, 31),
            new DateTime(DateTime.Now.Year, 4, 1),
            new DateTime(DateTime.Now.Year, 4, 2),
            new DateTime(DateTime.Now.Year, 4, 25),
            new DateTime(DateTime.Now.Year, 5, 7),
            new DateTime(DateTime.Now.Year, 8, 15),
            new DateTime(DateTime.Now.Year, 9, 1),
            new DateTime(DateTime.Now.Year, 12, 25),
            new DateTime(DateTime.Now.Year, 12, 26)
        };

        if (holidayState.Contains(holiday))
        {
            holidayToReturn = holiday;
        }

        return holidayToReturn;

    }

然后,您需要修改您的DisplayDateInfo以循环假日枚举。

代码语言:javascript
复制
 private static void DisplayDayInfo(DateTime fromDate, DateTime toDate)
    {
        var numDays = toDate.Subtract(fromDate).Days;

        Console.WriteLine("Total number of days from {0} to {1}: {2}\n", fromDate.ToShortDateString(), toDate.ToShortDateString(), numDays);

        var dates = Enumerable.Range(0, numDays).Select(days => fromDate.AddDays(days)).ToArray();

        var holiday = Enumerable.Range(0, numDays).Select(days => fromDate.AddDays(days)).ToArray();

        foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek)))
        {

            Console.WriteLine("{0} {1} ", dayOfWeek, GetDayCount(dates, dayOfWeek));
        }
        Console.WriteLine("****************************************************");

        foreach (DateTime dayOfWeek in holiday)
        {
            string holidayToWrite = GetHoliDayCount(dayOfWeek).ToString();
            if (holidayToWrite != "")
                Console.WriteLine("{0} ", holidayToWrite);
        }
    }

结果:

或者,如果您不想编辑GetHolidayCount方法的方法签名而不对DisplayDateInfo方法做任何更改,则可以通过将IEnumerable范围与数组中的日期进行比较来做到这一点,如果数组中的项包含IEnumerable中的日期,则将其添加到最终列表中。

代码语言:javascript
复制
 private static int GetHoliDayCount(IEnumerable<DateTime> holiday, DayOfWeek dayOfWeek)
    {

        List<DateTime> days = holiday.ToList(); //convert this to list
        List<DateTime> daysToAdd = new List<DateTime>(); //have a list as container for the holidays after the comparison.
        DateTime[] holidayState = new DateTime[]
        {
            new DateTime(DateTime.Now.Year, 1, 1),
            new DateTime(DateTime.Now.Year, 1, 26),
            new DateTime(DateTime.Now.Year, 3, 30),
            new DateTime(DateTime.Now.Year, 3, 31),
            new DateTime(DateTime.Now.Year, 4, 1),
            new DateTime(DateTime.Now.Year, 4, 2),
            new DateTime(DateTime.Now.Year, 4, 25),
            new DateTime(DateTime.Now.Year, 5, 7),
            new DateTime(DateTime.Now.Year, 8, 15),
            new DateTime(DateTime.Now.Year, 9, 1),
            new DateTime(DateTime.Now.Year, 12, 25),
            new DateTime(DateTime.Now.Year, 12, 26)
        };

        foreach (DateTime day in days)
        {
            if (holidayState.Contains(day))
            {
                daysToAdd.Add(day);
            }
        }

        holiday = daysToAdd;

        return holiday == null ? 0 : holidayState.Count(date => date.DayOfWeek == dayOfWeek);

    }

如果不希望将holidayState数组的实例化限制在当前年份,也可以使用此方法。这样做是将枚举中的年份分组,并运行假日枚举与分组中每年的数组的比较:

代码语言:javascript
复制
private static int GetHoliDayCount(IEnumerable<DateTime> holiday, DayOfWeek dayOfWeek)
    {
        var yearsGroup = holiday.GroupBy(x => x.Year);
        List<DateTime> daysToAdd = new List<DateTime>();
        DateTime[] holidayState = null;

        foreach (var year in yearsGroup)
        {
            List<DateTime> days = holiday.Where(x => x.Year == Convert.ToInt32(year.Key)).ToList();

            holidayState = new DateTime[]
              {
            new DateTime(Convert.ToInt32(year.Key), 1, 1),
            new DateTime(Convert.ToInt32(year.Key), 1, 26),
            new DateTime(Convert.ToInt32(year.Key), 3, 30),
            new DateTime(Convert.ToInt32(year.Key), 3, 31),
            new DateTime(Convert.ToInt32(year.Key), 4, 1),
            new DateTime(Convert.ToInt32(year.Key), 4, 2),
            new DateTime(Convert.ToInt32(year.Key), 4, 25),
            new DateTime(Convert.ToInt32(year.Key), 5, 7),
            new DateTime(Convert.ToInt32(year.Key), 8, 15),
            new DateTime(Convert.ToInt32(year.Key), 9, 1),
            new DateTime(Convert.ToInt32(year.Key), 12, 25),
            new DateTime(Convert.ToInt32(year.Key), 12, 26)
                  };

            foreach (DateTime day in days)
            {
                if (holidayState.Contains(day))
                {
                    daysToAdd.Add(day);
                }
            }

        }
        holiday = daysToAdd;           
        return holiday == null ? 0 : holidayState.Count(date => date.DayOfWeek == dayOfWeek);
    }

更新:使用上面提到的第一个实现,我能够获得给定范围内的所有日期(比如6个月)。我不知道这是不是你需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49869937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档