2015-09-23 49 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 - 你会想从你的方法返回

相关问题