代码之家  ›  专栏  ›  技术社区  ›  Serkan Hekimoglu

在C中获取两个DateTime之间的所有DateTime#

  •  65
  • Serkan Hekimoglu  · 技术社区  · 14 年前

    DateTime s、 我想得到所有 日期时间 在这两个日期之间。例如,如果我的日期是01.01.2010-05.01.2010,我的函数应该返回一个日期列表(list),它必须包含01.01.2010、02.01.2010、03.01.2010、04.01.2010和05.01.2010。

    我写了一个这样的函数。如果我的约会是在一个月内的话,效果很好。如果我的日期是2010年1月1日-2010年2月5日,那就不行了。因为月份变了,我的功能无法处理。C中是否有函数返回两个日期之间的所有日期?或者我该如何处理月变化?

    public void GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
        {
            List<DateTime> allDates = new List<DateTime>();
    
            int starting = startingDate.Day;
            int ending = endingDate.Day;
    
            for (int i = starting; i <= ending; i++)
            {
                allDates.Add(new DateTime(startingDate.Year, startingDate.Month, i));
            }
    

    问题解决了,请看Tim Robinson的简单答案。

    8 回复  |  直到 8 年前
        1
  •  138
  •   Tim Robinson    14 年前

    DateTime int . DateTime.AddDays

    for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1))
        allDates.Add(date);
    
        2
  •  76
  •   Matt Hamilton    14 年前

    public IEnumerable<DateTime> DateRange(DateTime fromDate, DateTime toDate)
    {
        return Enumerable.Range(0, toDate.Subtract(fromDate).Days + 1)
                         .Select(d => fromDate.AddDays(d));
    }
    

        3
  •  11
  •   Darin Dimitrov    14 年前
    public IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
    {
        if (endingDate < startingDate)
        {
            throw new ArgumentException("endingDate should be after startingDate");
        }
        var ts = endingDate - startingDate;
        for (int i = 0; i < ts.TotalDays; i++)
        {
            yield return startingDate.AddDays(i);
        }
    }
    
        4
  •  6
  •   Jamiec    14 年前

    你太接近了。。。只是不要用一天,用整个日期。

    static IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
    {
        List<DateTime> allDates = new List<DateTime>();
    
    
        for (DateTime i = startingDate; i <= endingDate; i = i.AddDays(1))
        {
            allDates.Add(i);
        }
        return allDates.AsReadOnly();
    }
    
        5
  •  2
  •   Kamil Budziewski    11 年前

    如果频率是每周或每月一次,这就可以了-你可以根据需要定制它。

        protected static Dictionary<DateTime, String> getDateRange(String lowerDate, String higherDate, String frequency)
        {
            DateTime startDate, endDate;
            startDate = Convert.ToDateTime(lowerDate);
            endDate = Convert.ToDateTime(higherDate);
    
            Dictionary<DateTime, String> returnDict = new Dictionary<DateTime, String>();
    
            while (frequency.Equals("weekly") ? (startDate.AddDays(7) <= endDate) : (startDate.AddMonths(1) <= endDate))
            {
                if (frequency.Equals("weekly"))
                {
                    returnDict.Add(startDate, startDate + "-" + startDate.AddDays(7));
                    startDate = startDate.AddDays(8);
                }
                if (frequency.Equals("monthly"))
                {
                    returnDict.Add(startDate, startDate + "-" + startDate.AddMonths(1));
                    startDate = startDate.AddMonths(1).AddDays(1);
                }
            }
    
            returnDict.Add(startDate, startDate + "-" + endDate);
    
            return returnDict;
        }
    
        6
  •  2
  •   timi2shoes    9 年前

    如果日期包含不同的时间,顶级解决方案将失败。以下是一个解决方案,可以让您全天、全天、全天工作:

    所有日期:

    static public List<string> get_days_between_two_dates(DateTime start_date, DateTime end_date)
        {
            List<string> days_list = new List<string>();
            DateTime temp_start;
            DateTime temp_end;
    
            //--Normalize dates by getting rid of minues since they will get in the way when doing the loop
            temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day);
            temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day);
    
            //--Example Should return
            //--1-12-2014 5:59AM - 1-13-2014 6:01AM return 12 and 13
            for (DateTime date = temp_start; date <= temp_end; date = date.AddDays(1))
            {
                days_list.Add(date.ToShortDateString());
            }
    
            return days_list;
        }
    

    所有时间:

    static public List<string> get_hours_between_two_dates(DateTime start_date, DateTime end_date)
        {
            List<string> hours_24_list = new List<string>();
            DateTime temp_start;
            DateTime temp_end;
    
            //--Normalize dates by getting rid of minutes since they will get in the way when doing the loop
            temp_start = new DateTime(start_date.Year, start_date.Month, start_date.Day, start_date.Hour, 0, 0);
            temp_end = new DateTime(end_date.Year, end_date.Month, end_date.Day, end_date.Hour, 0, 0);
    
            //--Example Should return
            //--5:59AM - 6:01AM return 5am and 6am
            for (DateTime date = temp_start; date <= temp_end; date = date.AddHours(1))
            {
                hours_24_list.Add(date.ToShortTimeString());
            }
    
            return hours_24_list;
        }
    
        7
  •  2
  •   slugster Joey Cai    3 年前

    AddDays()

    class Program
    {
        static void Main(string[] args)
        {
            GetDates(new DateTime(2010, 1, 1), new DateTime(2010, 2, 5));
    
            Console.ReadKey();
        }
    
        static List<DateTime> GetDates(DateTime startDate, DateTime endDate)
        {
            List<DateTime> dates = new List<DateTime>();
    
            while ((startDate = startDate.AddDays(1)) < endDate)
                dates.Add(startDate);
    
            return dates;
        }
    }
    

    Enumerable.Range() answer from Matt 是一个更好的解决方案。

        8
  •  1
  •   benka Csaba    9 年前
    static IEnumerable<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
    {
        List<DateTime> allDates = new List<DateTime>();
    
    
        for (DateTime i = startingDate; i <= endingDate; i = i.AddDays(1))
        {
            allDates.Add(i);
        }
        return allDates.AsReadOnly();
    }