1

このようなものを表示するには助けが必要です。お気づきの場合は、これがスタック オーバーフロー アカウントのメンバーシップ期間です。

member for  2 years, 3 months

同じように少し修正が必要です。私の条件と表示形式は次のとおりです。

  Conditions              Display Format
1. Below 7 days  ->       Days (5 days)
2. 7 -30 days    ->       Weeks, days   ( 2 Weeks, 3 Days) in case of 17 days.
3. 30 - 365      ->       Months, Weeks, Days (4Months, 2Weeks, 2Days) in case of 136 days
3. 365 or grter  ->       Years, Months only (2years, 3 Months)

What I did:

Timespan を使用して日付の差を取得しています。しかし、私は自分のアウトプットに満足していません。登録が 2 ~ 3 日後に 2 か月になるメンバーがいますが、まだ 1 か月前に表示されています。これが私のコードです:

 TimeSpan ts = DateTime.Now - Convert.ToDateTime(company.RegistrationDate);

                 if (ts.Days > 365)
                    membersince.InnerText = string.Format("{0} years", (ts.Days / 365));
                else if (ts.Days < 30)
                    membersince.InnerText = string.Format("{0} days", ts.Days);
                     else if(ts.Days > 30)
                    membersince.InnerText = string.Format("{0} months", (ts.Days/30));
4

4 に答える 4

2

Time Period Library for .NETライブラリのDateDiffクラスを使用できます。

// ----------------------------------------------------------------------
public void DateDiffSample()
{
  DateTime date1 = new DateTime( 2009, 11, 8, 7, 13, 59 );
  Console.WriteLine( "Date1: {0}", date1 );
  // > Date1: 08.11.2009 07:13:59
  DateTime date2 = new DateTime( 2011, 3, 20, 19, 55, 28 );
  Console.WriteLine( "Date2: {0}", date2 );
  // > Date2: 20.03.2011 19:55:28

  DateDiff dateDiff = new DateDiff( date1, date2 );

  // elapsed
  Console.WriteLine( "DateDiff.ElapsedYears: {0}", dateDiff.ElapsedYears );
  // > DateDiff.ElapsedYears: 1
  Console.WriteLine( "DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths );
  // > DateDiff.ElapsedMonths: 4
  Console.WriteLine( "DateDiff.ElapsedDays: {0}", dateDiff.ElapsedDays );
  // > DateDiff.ElapsedDays: 12
  Console.WriteLine( "DateDiff.ElapsedHours: {0}", dateDiff.ElapsedHours );
  // > DateDiff.ElapsedHours: 12
  Console.WriteLine( "DateDiff.ElapsedMinutes: {0}", dateDiff.ElapsedMinutes );
  // > DateDiff.ElapsedMinutes: 41
  Console.WriteLine( "DateDiff.ElapsedSeconds: {0}", dateDiff.ElapsedSeconds );
  // > DateDiff.ElapsedSeconds: 29
} // DateDiffSample
于 2012-04-08T16:32:57.640 に答える
1

を使用するだけTotalDaysで double が得られます(そして、コンポーネントだけのように「政治的に」正しいDaysですが、あなたの場合は似ています)、Math.Round()@Iliaによって「最も近い」にすでに提案されているように。

Math.Round(ts.TotalDays);

...また

String.Format("{0:0.##}", ts.TotalDays);  

...これはあなたに好感を与えるはずです1.7 months(私の頭から思い出したり、あなたの勝利フォーマットをテストしたりします)

それはより論理的でユーザーインターフェースの問題であり、ユーザーに「提示」する方法です。

編集:TotalDaysフォーマットするだけで使用1.7するか、Math.Roundを使用して丸月を取得します

于 2012-04-08T14:38:31.467 に答える
1

なぜこれが問題なのですか?自分の年齢が 57 日である場合、57 / 30 == 1. あなたが2これから抜け出すことを期待しているなら、あなたはすべきです

30.01) 除算の結果が double であることを確認します (単純に の代わりに で除算します30)。その理由は、それint / intint.

簡単なテスト:
(57 / 30).GetType().Name == Int32
(57 / 30.0).GetType().Name == Double

また(int)1.9 == 1

2)Math.Round()結果。これは、小数点以下のすべてを削除するのではなく、実際の数学的丸めになります。

于 2012-04-08T14:25:07.103 に答える
0
static public string calculateAge(DateTime birthDate, DateTime now)
{
  birthDate = birthDate.Date;
  now = now.Date;

  var days = now.Day - birthDate.Day;
  if (days < 0)
  {
    var newNow = now.AddMonths(-1);
    days += (int)(now - newNow).TotalDays;
    now = newNow;
  }
  var weeks = days / 7;
  days = days - weeks * 7;
  var months = now.Month - birthDate.Month;
  if (months < 0)
  {
    months += 12;
    now = now.AddYears(-1);
  }
  var years = now.Year - birthDate.Year;

  if (years > 0)
  {
    if (months > 0)
      return string.Format("{0} Years, {1} Months", years, months);
    else
      return string.Format("{0} Years", years);
  }
  if (months > 0)
  {
    var builder = new StringBuilder();
    builder.AppendFormat("{0} Months", months);
    if (weeks > 0)
      builder.AppendFormat(", {0} Weeks", weeks);
    if (days > 0)
      builder.AppendFormat(", {0} Days", days);
    return builder.ToString();
  }
  if (weeks > 0)
  {
    if (days > 0)
      return string.Format("{0} Weeks, {1} Days", weeks, days);
    return string.Format("{0} Weeks", weeks);
  }

  return string.Format("{0} Days", days);
}
于 2012-04-08T14:52:50.640 に答える