2011-01-20 21 views
6
DateTime dayStart; 
DateTime dateEnd; 

TimeSpan ts = dateEnt - dateStart; 

印刷:...年(S)と...月(S)2つの日付の年と月の違いを見つける方法は?

私はそれを計算することができますか?

の.NET Framework 2.0
のC#

asp.netプロジェクト。

+0

ここでは(多くの)定義が必要です。 2011年1月31日〜2011年1月2日の間に何ヶ月?分数が必要な場合は、どれくらいの月がありますか? –

答えて

3

これは、正確に計算したいものによって異なります。

TimeSpanの値は年と月の長さが異なるため、正確な年と月に変換することはできません。あなたは、このようなおおよその年と月を計算することができます。

int years = ts.Days/365; 
int months = (ts.Days % 365)/31; 

あなたが正確な差をつけたい場合は、あなたがDateTime値を比較する必要があります。

7

You should first read this articleJon Skeetから、特に「期間と期間の算術の紹介」のテキストは興味深いものです。

だから、あなたは一定の期間が月の変化であるときなど年に、

Noda-timeを定義する必要があり、すでにこのために多くの機能が含まれています。しかし、私はそれがまだリリースされていないと思う。

+1

ガー、他の人が私のためにやってくれたらノーダタイムに言及する見込みがあることに、私は何の疑問があるのですか? ;) –

+0

@ジョン:申し訳ありません、ちょうど私が記事を読んだことを思い出しました。 – GvS

+0

うわー、ノーダットタイムについて聞いたことがなく、日付/時間スパンの計算の複雑さについて本当に考えたことはありません。最初にリンクを読んで、私は "ええ、そうだよ。どうして私はそれを考えなかったの?" +1してStackOverflowを作ってくれたおかげで、この古い犬に別の新しいトリックを学べるようになるための新しい何かを与えてくれた。 – David

2

私はこのような何かがそれを行うだろうと思う:

DateTime date1 = new DateTime(1973, 07, 20); 
    DateTime date2 = new DateTime(2010, 01, 10); 

    // Swap them if one is bigger than the other 
    if (date2 < date1) 
    { 
    DateTime date3 = date2; 
    date2 = date1; 
    date1 = date3; 
    } 

    // Now date2 >= date1. 

    TimeSpan ts = date2 - date1; 

    // Total days 
    Console.WriteLine(ts.TotalDays); 

    // Total years 
    int years = date2.Year - date1.Year; 

    int months = 0; 
    // Total monts 
    if (date2.Month < date1.Month) 
    { 
    // example: March 2010 (3) and January 2011 (1); this should be 10 monts 
    // 12 - 3 + 1 = 10 
    // Take the 12 months of a year into account 
    months = 12 - date1.Month + date2.Month; 
    } 
    else 
    { 
    months = date2.Month - date1.Month; 
    } 
    Console.WriteLine("Years: {0}, Months: {1}", years, months); 

編集を明確にする:12ヶ月は年に常に存在しているので、複雑な日付algorhitmsまたはスタッフのその種のいずれかの必要は、ありません(少なくともカレンダーでは)。

3

のDateTime DOB = "1981年10月18日" 年、月、日で年齢を計算すれば、以下の通り。 //生年月日 DateTime now = DateTime.Now;

 // Swap them if one is bigger than the other 
     if (now < dob) 
     { 
      DateTime date3 = now; 
      now = dob; 
      dob = date3; 
     } 
     TimeSpan ts = now - dob; 
     //Debug.WriteLine(ts.TotalDays); 

     int years = 0; 
     int months = 0, days=0; 
     if ((now.Month <= dob.Month) && (now.Day < dob.Day)) // i.e. now = 03Jan15, dob = 23dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year-1; 
      months = 12 - dob.Month + now.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 

      if(months==12) 
      { 
       months=0; 
       years +=1; 
      } 
     } 
     else if ((now.Month <= dob.Month) && (now.Day >= dob.Day)) // i.e. now = 23Jan15, dob = 20dec14 
     { 
      // example: March 2010 (3) and January 2011 (1); this should be 10 months. // 12 - 3 + 1 = 10 
      years = now.Year - dob.Year - 1; 
      months = 12 - dob.Month + now.Month; 
      days = now.Day - dob.Day; 
      if (months == 12) 
      { 
       months = 0; 
       years += 1; 
      } 
     } 
     else if ((now.Month > dob.Month) && (now.Day < dob.Day)) // i.e. now = 18oct15, dob = 22feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month-1; 
      days = DateTime.DaysInMonth(dob.Year, dob.Month) - dob.Day + now.Day; 
     } 
     else if ((now.Month > dob.Month) && (now.Day >= dob.Day)) // i.e. now = 22oct15, dob = 18feb14 
     { 
      years = now.Year - dob.Year; 
      months = now.Month - dob.Month; 
      days = now.Day - dob.Day; 
     } 
     Debug.WriteLine("Years: {0}, Months: {1}, Days: {2}", years, months, days); 
関連する問題