日期和时间计算器

时间:2018-04-17 04:27:41

标签: c# asp.net webforms

我希望得到一些我一直在努力的帮助。 我有一个ASP.NET网页表单,试图成为一个计算器,现在我有一周的日期和日期,以及其他形式的其他部分工作。 现在我需要在此表单中添加公共假期。

我有一个包含日期的数组,如果我输入任何类型的日期范围,我会得到全部计数,好像它是在计算一整年。

目的是阅读日期愤怒,并在所述日期愤怒中选择假期,并仅显示所述日期,例如两年后,计数应该是两倍。

我确信这很简单,我只是没有看到它。

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

任何帮助都会谢谢,谢谢。

1 个答案:

答案 0 :(得分:0)

我根据你的意图改变了你方法的一些实现:

    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以循环可枚举的假日。

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

结果:

Result

或者,如果您不想编辑GetHolidayCount方法的方法签名并且不对DisplayDateInfo方法进行任何更改,则可以通过将IEnumerable范围与数组中的日期进行比较,以及是否有项目来执行此操作在数组中包含IEnumerable中的日期,然后将其添加到最终列表。:

Result2

 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数组的实例化限制为当前年份,也可以使用此方法。这样做的是它将您的可枚举年份分组并在分组中运行可枚举的假日与每年的数组的比较:

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个月)。我不知道这是否是你需要的。

enter image description here

相关问题