2017-05-16 123 views
0

所以我試圖通過從用戶獲取開始日期和結束日期來創建圖表。我需要計算日期之間的月數,然後每個月計算一下天數並獲取月份的名稱。計算兩個日期之間的月份,然後計算每個月的日期

我已經得到了兩個日期之間的月數,但似乎無法將餘下的代碼轉化爲代碼。我有一個名爲MonthRange

public class MonthRange 
{ 
    public DateTime startDate { get; set; } 

    public DateTime endDate { get; set; } 

    public string monthName { get; set; } 

    public MonthRange() { 
    } 

    public MonthRange(DateTime startDate, DateTime endDate, string monthName) { 
     this.startDate = startDate; 
     this.endDate = endDate; 
     this.monthName = monthName; 
    } 
} 

而我的方法類:

private List<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) { 

    List<MonthRange> result = new List<MonthRange>(); 
    int months = (endDate.Year - startDate.Year)*12 + endDate.Month - startDate.month; 

foreach(var m in months){ 
    //get the start and end date of that month with the name and add it to the result list. 
} 

} 

起腳的是,如果起始日期是中途一個月,然後就是什麼應該被保存在結果列表中,同樣如果endDate是月份的中間位置,那應該保存。我有點失落,並希望得到任何幫助。

編輯:所以這是我試圖實現的一個例子。我試圖創建一個圖表,繪製一個人在特定時間範圍內有食物的次數。

編輯2:所以我結束了會是這樣的:

private List<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) { 

     List<MonthRange> result = new List<MonthRange>(); 

     DateTime holder = startDate; 

     var months = (endDate.Year - startDate.Year) * 12 + endDate.Month - startDate.Month; 


     for (int i = 0; i <= months; i++) { 
      if (i == 0) 
      { 
       result.Add(new MonthRange(startDate, CalculateStartOfMonth(endDate), startDate.ToString("MMM"))); 
      } 
      else if (i == months) 
      { 
       result.Add(new MonthRange(CalculateEndOfMonth(startDate), endDate, endDate.ToString("MMM"))); 
      } 
      else { 
       DateTime middleMonth = holder.AddMonths(1); 
       result.Add(new MonthRange(CalculateStartOfMonth(middleMonth), CalculateEndOfMonth(middleMonth), middleMonth.ToString("MMM"))); 
      } 
     } 

     return result; 
    } 

    private DateTime CalculateStartOfMonth(DateTime endDate) { 
     var startOfMonth = new DateTime(endDate.Year, endDate.Month, 1); 
     return startOfMonth; 
    } 

    private DateTime CalculateEndOfMonth(DateTime startDate) 
    { 
     var endOfMonth = new DateTime(startDate.Year, startDate.Month, DateTime.DaysInMonth(startDate.Year, startDate.Month)); 
     return endOfMonth; 
    } 
+0

要實現任何例如輸入和輸出? – Mark

+2

你確定你所擁有的甚至是正確的嗎?你是否真的想要返回'1'作爲月數,當你輸入例如'2016年12月31日23:59'和'2017年1月1日00:01'分別作爲您的開始日期和結束日期?其餘的描述同樣含糊。您需要先編寫_precise_,_unambiguous_規範,詳細說明您實際需要的計算方式。這樣,代碼將很容易編寫。沒有它,你可以在圈子裏漫步數週,試圖弄清楚這一點。 –

+0

@標誌例如:如果用戶輸入startDate爲16/05/2017,endDate爲24/07/2017。那麼月的數量應該是3,而第一個月的開始日期是16日,第二個月將是整體,第三個月將在24日結束。那有意義嗎? – bluebrigade23

回答

1

注意:這不是對問題的回答,而是對不同方法的建議。由於這個問題是關於一個人在一段時間內的餐飲數量的圖表,我認爲自然的方式來處理這個問題(至少是爲了表示數據)是在白天而不是按月進行。 (從表面上看,數據可能需要按月份來表示,但首先按天組織數據,然後按月呈現數據要容易得多。)

由於問題相當模糊,我對數據做了一些假設。這個類可以用來存儲關於一天的信息。

class DayEntry 
{ 
    public DateTime Date { get; set; } 
    public string MonthName { get; set; } 
    public int NumberOfMeals { get; set; } 
} 

下面的函數創建DayEntry對象的列表,每一天中的時間範圍初始化:

List<DayEntry> CreateDayEntries(DateTime dateStart, DateTime dateEnd) 
{ 
    var dateDiff = dateEnd - dateStart; 
    var dayCount = (int) Math.Ceiling(dateDiff.TotalDays) + 1; 
    var dayRange = new List<DayEntry>(dayCount); 

    for (var i = 0; i < dayCount; i++) 
    { 
     var date = dateStart.AddDays(i); 
     var dayEntry = new DayEntry 
     { 
      Date = date, 
      NumberOfMeals = 0, // TODO 
      MonthName = date.ToString("MMMM", CultureInfo.CurrentCulture) 
     }; 

     dayRange.Add(dayEntry); 
    } 

    return (dayRange); 
} 

當數據爲指定日期範圍內製備,它然後可以在顯示一個按月分組的UI - 由於每天的條目都有它自己的日期(以及它所屬月份的名稱),並且在列表中依次排列,因此可以輕鬆遍歷它們並創建UI輸出。

+0

這是我有點找。我用你的答案,但做了一些改變,如何計算日期,名稱等。添加我的答案的職位:) – bluebrigade23

+0

@ bluebrigade23沒問題,我很高興,如果它是有用的。 – xxbbcc

0

我的建議是你的一切先轉換爲天。

例如。 x= 361 ; // total number of days

然後從那裏你可以將它們分成幾個月和幾年。

months = x/30; // find months 
days = x%30; // find the remainder of the days from the month 
years = months/12; // find years 

這種方式更容易計算。

+0

'2017/01/31' - '2017/03/01'怎麼樣?首先是 – xxbbcc

+0

。我的方法是找到給定範圍2017/01/31 - 2017/03/01中的日期數量,這相當於89天。然後從那裏你分開30找到月= 2.從那裏你可以看到,它是0年2個月和29天。 – Hank

+0

錯了。該日期範圍代表_3_個月內的30天。 2017年2月只有28天,選擇1月的最後一天,3月的第一天爲30天。您的方法由於多種原因而不正確。 – xxbbcc

0

根據您的MonthRange結構,試試這個:

private IEnumerable<MonthRange> GetRangeOfMonthsBetweenDates(DateTime startDate, DateTime endDate) {   
    var start = startDate; 
    while(start<endDate) { 
     var end = start.AddMonths(1).AddDays(-start.Day);   
     yield return new MonthRange(start, end < endDate ? end : endDate, start.ToString("MMMM")); 

     start = end.AddDays(1); 
    } 
} 

例如:

var start = new DateTime(2017,5,16); 
var end = new DateTime(2017,7,24); 

foreach(var m in GetRangeOfMonthsBetweenDates(start, end)) { 
    Console.WriteLine("{0}: {1:dd/MM/yyyy}-{2:dd/MM/yyyy}", m.monthName, m.startDate, m.endDate); 
} 

應打印:

May: 16/05/2017-31/05/2017 
June: 01/06/2017-30/06/2017 
July: 01/07/2017-24/07/2017 
相關問題