2015-09-23 57 views
3

以下是我的代碼。我只是得到兩個日期之間的差異,但我想要在該日期和之間的那個月的名稱。如何獲得兩個日期之間的月份集合?

public static int GetMonthsBetween(DateTime from, DateTime to) 
{ 
    if (from > to) return GetMonthsBetween(to, from); 

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1))); 

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day) 
    { 
     return monthDiff - 1; 
    } 
    else 
    { 
     return monthDiff; 
    } 
} 
+0

你會重播嗎?我認爲這是Java,但我不確定。你的意思是使用'na'標籤嗎? – halfer

+1

@halfer:據我所知現在是C#,至少這會解釋「>」運算符進行比較。 –

+0

您是否需要基於int的月份的名稱,或者您是否需要計算,甚至是兩者之間的距離,從DateTime還是到DateTime? – Andre

回答

4

基於您的代碼,你可以從您輸入「到」日期時間獲得日期時間差的。減去一個月差異所產生的月份名稱。

public static List<DateTime> GetMonthsBetween(DateTime from, DateTime to) 
{ 
    if (from > to) return GetMonthsBetween(to, from); 

    var monthDiff = Math.Abs((to.Year * 12 + (to.Month - 1)) - (from.Year * 12 + (from.Month - 1))); 

    if (from.AddMonths(monthDiff) > to || to.Day < from.Day) 
    { 
     monthDiff -= 1; 
    } 

    List<DateTime> results = new List<DateTime>(); 
    for (int i = monthDiff; i >= 1; i--) 
    { 
     results.Add(to.AddMonths(-i)); 
    } 

    return results; 
} 

要得到月份的名稱,只需將DateTime格式化爲「MMM」即可。

var dts = GetMonthsBetween(DateTime.Today, DateTime.Today.AddMonths(5)); 
foreach (var dateTime in dts) 
{ 
    Console.WriteLine(dateTime.ToString("MMM")); 
} 
+0

你的答案是正確的,但它只給予一個月的回報,我想列出來自和迄今 – Sanjana

+0

之間的月份,謝謝它幫助了我很多...... :-) – Sanjana

+0

我得到的月份三月,四月,五月, Jun給定日期2017-03-01和2017-07-01。我的問題是,我怎麼能包括過去的第七個月(7月)呢? –

1

假設您使用的是Java和JodaTime,那麼代碼中存在一些缺陷。

  1. 您無法使用from > to來評估日期是否在其他日期之後。改爲使用from.isAfter(to)
  2. JodaTime已經提供了一種計算兩個給定日期之間的整月數量的方法Months.monthsBetween(start,end)
  3. 通過計算出的月份差異,您可以實例化一個新的DateTime對象,該對象在您想要的月份中保存日期,並通過yourNewDateTimeObject.month().getAsText()輸出其名稱。

編輯:剛剛發現你正在使用C#,所以忽略我的文字在上面。在這裏,我將嘗試在C#中回答你的問題。

  1. 你爲什麼不只是減去從tofrom並獲得您的區別?

  2. 生成的TimeSpan可用於確定兩個給定日期之間整個月的數量。

  3. 要獲得你可以使用yourDateTime.ToString("MMMM");
+0

我不認爲這很容易,TimeSpan沒有TotalMonths,因爲一個月可能會有不同的天數。 – Andre

+0

@Andre我不想爲他完全編程,因爲我想他可以自己做。我寧願想要展示一種替代方法,它可以更有效地使用給定類(如果正確實施),而不是單獨編寫所有內容。另外他可以使用NodaTime庫。 –

2

如果你想的兩個日期之間的所有月份的名稱,使用是這樣的:

var d1 = new DateTime(2015,6,1); 
var d2 = new DateTime(2015,9,1); 

var monthlist = new List<string>(); 
string format = d1.Year == d2.Year ? "MMMM" : "MMMM yyyy"; 

for (var d = d1; d <= d2; d = d.AddMonths(1)) 
{ 
    monthlist.Add(d.ToString(format)); 
} 

的完整列表現在是monthlist - 你會想從你的方法返回

相關問題