2012-08-13 8 views
16

開始日と終了日を知りたい場合は、2つの日付間の月と年を取得する方法を知りたいと思います。例えば、Start Date: '1/1/2011'(mm/dd/yyyy)およびEnd date :'11/30/2011'。検索する ヶ月と年がJanuary,2011; February,2011; March,2011; and so on till November,20112つの日付間の月を一覧表示します

+8

これは宿題のように聞こえる。アイデアは、あなた自身でこれを働かせることです。これまでの解決策に何か問題がある場合は、私は喜んで支援します。 –

+0

複製:http://stackoverflow.com/questions/1525990/difference-in-months – h1ghfive

+1

@ h1ghfive - いいえ、それはその1つの複製ではありません – PHeiberg

答えて

1

この式を使用して、次のとおりです。

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month 

とUは、月の数を取得します。

これを適切な方法で使用すると、それを解読します。

へようこそStackworkflowへようこそHardworkはあなたの部分であり、それが問題を抱えている場合には兄弟姉妹のために考えていることです。ここで

+0

より低い月があるように月をチェックする必要がありますより高い月から引いたものは、最初の月が常に2番目の月よりも大きいと仮定することはできません。 –

+1

@モンキーボーイ - あなたは正しいですが、これは種です。デベロッパーは問題を抱えているときに学びます。 – bhuvin

37

我々は

public static IEnumerable<Tuple<string, int>> MonthsBetween(
      DateTime startDate, 
      DateTime endDate) 
    { 
     DateTime iterator; 
     DateTime limit; 

     if (endDate > startDate) 
     { 
      iterator = new DateTime(startDate.Year, startDate.Month, 1); 
      limit = endDate; 
     } 
     else 
     { 
      iterator = new DateTime(endDate.Year, endDate.Month, 1); 
      limit = startDate; 
     } 

     var dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat; 
     while (iterator <= limit) 
     { 
      yield return Tuple.Create(
       dateTimeFormat.GetMonthName(iterator.Month), 
       iterator.Year);     
      iterator = iterator.AddMonths(1); 
     } 
    } 

を行くと明らかにあなたは結果が

{ 
    { "January", 2011 }, 
    { "February", 2011 }, 
    { "March", 2011 }, 
    { "April", 2011 }, 
    { "May", 2011 }, 
    { "June", 2011 }, 
    { "July", 2011 }, 
    { "August", 2011 }, 
    { "September", 2011 }, 
    { "October", 2011 }, 
    { "November", 2011 }, 
} 

のようなものあなたの文化に依存している月の名前でなければなりません。この

var startDate = DateTime.ParseExact("01/01/2011", "MM/dd/yyyy"); 
var endDate = DateTime.ParseExact("11/30/2011", "MM/dd/yyyy"); 

var months = MonthsBetween(startDate, endDate); 

のようにそれを呼び出しています、私は思っています、あなたが求めているものです、そうですか?

+1

+1:おい、クリーン!! – bhuvin

+0

@GauravChouhan、良い編集。 – Jodrell

+0

これは完璧です!これは本当にありがとう! – Ethenyl

6

あなたは開始日が、それは開始日から関連する月と年の部分に引き出し、あなたが持っているかもしれない(それらを格納以内に終了日

以下のwhileループを始めることができます具体的なクラスやなど)、そして、あなたは2つの日付の間の月と年を取得するためにEnumerable.Range機能を使用することができますAddMonths(1)

//something on these lines 
while(startdate <= enddate) 
{ 
// pull out month and year 
startdate = startdate.AddMonths(1); 
} 
+0

これは本当に選ばれた答えでなければなりません。文字通り2行のコードと多くの選択された答え。 – Ricky

3

を使用して1ヶ月で開始日をインクリメント

var start = new DateTime(2011, 1, 1); 
var end = new DateTime(2011, 11, 30); 

var diff = Enumerable.Range(0, 13).Select(a => start.AddMonths(a)) 
      .TakeWhile(a => a <= end) 
      .Select(a => String.Concat(a.ToString("MMMM") + ", " + a.Year)); 
+0

ありがとう、兄。私はこのスタイル{.Select(e => e.ToString( "yyyyMM"));} –

+0

を使用します。 2011-1-23 - > 2011-2-1(2011-1)になります。終了日の月の最終日と比較する必要があります。 .TakeWhile(a => a <= end.AddDays(DateTime.DaysInMonth(end.Year、end.Month)-end.Day)) – phiree

関連する問題