C# 使用Timespan显示总持续时间

C# 使用Timespan显示总持续时间,c#,asp.net,.net,datetime,timespan,C#,Asp.net,.net,Datetime,Timespan,我需要帮助来展示这样的东西。如果您认识到,这是我们的堆栈溢出帐户的成员期限 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

我需要帮助来展示这样的东西。如果您认识到,这是我们的堆栈溢出帐户的成员期限

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));
TimeSpan ts=DateTime.Now-Convert.ToDateTime(company.RegistrationDate);
如果(ts.Days>365)
membersince.InnerText=string.Format(“{0}年”,(ts.Days/365));
否则,如果(ts.天<30天)
membersince.InnerText=string.Format(“{0}天”,ts.days);
否则,如果(ts.Days>30)
membersince.InnerText=string.Format(“{0}months”,(ts.Days/30));

为什么这是个问题?如果一个人的年龄是57天,那么
57/30==1
。如果您希望从中获得
2
,那么您应该

1) 确保除法的结果是双倍的(只需除以
30.0
,而不是
30
)。原因是
int/int
也是
int

简单测试:
(57/30).GetType().Name==Int32

(57/30.0).GetType().Name==Double

另外
(int)1.9==1


2)
Math.Round()
结果。这将是实际的数学四舍五入,而不是将小数点后的所有内容都删除。

为什么这是一个问题?如果一个人的年龄是57天,那么
57/30==1
。如果您希望从中获得
2
,那么您应该

1) 确保除法的结果是双倍的(只需除以
30.0
,而不是
30
)。原因是
int/int
也是
int

简单测试:
(57/30).GetType().Name==Int32

(57/30.0).GetType().Name==Double

另外
(int)1.9==1


2)
Math.Round()
结果。这将是实际的数学四舍五入,而不是只在小数点后删除所有内容。

只需使用
TotalDays
,它将为您提供双倍的数据(并且更“政治”正确,因为
Days
只是一个组成部分,尽管在您的情况下类似),和
Math.Round()
正如@Ilia所建议的“最近的”

Math.Round(ts.TotalDays);
…或

…这应该会给你1.7个月的时间(正如我在脑海中回忆的那样,或者是对你的获奖形式的测试)

这更像是一个逻辑和用户界面问题,即如何向用户“展示”


编辑:使用
TotalDays
格式为
1.7
——或者使用Math.Round获得一个整月只需使用
TotalDays
即可获得双倍(并且更“政治”正确,因为
Days
只是其中的一部分,尽管在您的情况下类似),以及
Math.Round()
正如@Ilia所建议的“最近的”

Math.Round(ts.TotalDays);
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);
}
…或

…这应该会给你1.7个月的时间(正如我在脑海中回忆的那样,或者是对你的获奖形式的测试)

这更像是一个逻辑和用户界面问题,即如何向用户“展示”

编辑:仅使用
TotalDays
将格式设置为
1.7
——或使用Math.Round获得一个整数月

静态公共字符串calculateAge(DateTime birthDate,DateTime now)
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);
}
{ 生日=生日。日期; 现在=现在.日期; var days=now.Day-生日.Day; 如果(天数<0) { var newNow=now.AddMonths(-1); 天数+=(整数)(现在-现在)。总天数; 现在=现在; } var周=天/7; 天=天-周*7; var months=now.Month-生日.Month; 如果(月数<0) { 月数+=12; now=now.AddYears(-1); } var years=now.Year-生日.Year; 如果(年数>0) { 如果(月数>0) 返回string.Format(“{0}年,{1}月”,年,月); 其他的 返回string.Format(“{0}年”,年); } 如果(月数>0) { var builder=新的StringBuilder(); builder.AppendFormat(“{0}个月”,月); 如果(周数>0) AppendFormat(“,{0}周”,周); 如果(天数>0) AppendFormat(“,{0}天”,天); 返回builder.ToString(); } 如果(周数>0) { 如果(天数>0) 返回string.Format(“{0}周,{1}天”,周,天); 返回string.Format(“{0}周”,周); } 返回string.Format(“{0}天”,天); }
静态公共字符串calculateAge(日期时间出生日期,日期时间现在)
{
生日=生日。日期;
现在=现在.日期;
var days=now.Day-生日.Day;
如果(天数<0)
{
var newNow=now.AddMonths(-1);
天数+=(整数)(现在-现在)。总天数;
现在=现在;
}
var周=天/7;
天=天-周*7;
var months=now.Month-生日.Month;
如果(月数<0)
{
月数+=12;
now=now.AddYears(-1);
}
var years=now.Year-生日.Year;
如果(年数>0)
{
如果(月数>0)
返回string.Format(“{0}年,{1}月”,年,月);
其他的
返回string.Format(“{0}年”,年);
}
如果(月数>0)
{
var builder=新的StringBuilder();
builder.AppendFormat(“{0}个月”,月);
如果(周数>0)
AppendFormat(“,{0}周”,周);
如果(天数>0)
AppendFormat(“,{0}天”,天);
返回builder.ToString();
}
如果(周数>0)
{
如果(天数>0)
返回string.Format(“{0}周,{1}天”,周,天);
返回string.Format(“{0}周”,周);
}
返回string.Format(“{0}天”,天);
}

您可以使用库的DateDiff类:


您可以使用库的DateDiff类:


你和黛比一起经历过吗