其中listObjAge是具有多个句点的列表;

Period objTotalPeriod = listObjAge[0].period;
for (int i = 1; i < listObjAge.Count; i++) {
   objTotalPeriod += listObjAge[i].period;
}


简而言之:
我得到的是:

listObjAge[0].period + listObjAge[1].period = ????.
2 yr 1 mnth 28 days  + 0 yr 8 mnth 30 days  = 2 yr 9 mnth 58 days
// this result is not wrong but is there any way to correctly add days for the above code.


我期望的是:

2 yr 1 mnth 28 days  + 0 yr 8 mnth 30 days  = 2 yr 10 mnth 28 days


如您所见,我想添加两个期间的结果。有什么方法可以使用nodatime实现。

解决了:
我知道它在理论上是不正确的。但这对我有用。

int intDays = 0;
for (int i = 0; i < listObjAge.Count; i++) {
     intDays += listObjAge[i].period.Days; // adding all the days for every period
}

strYear = (intDays / 365).ToString();
strMonth = ((intDays % 365) / 30).ToString();
strDays = ((intDays % 365) % 30).ToString();

最佳答案

听起来您正在寻找某种可以使月份和日期(以及周?)正常化的东西。现有的Normalize方法处理从“几天下来”(例如小时)开始的所有内容,因此您可以使用以下方法开始:

public static Period NormalizeIncludingMonths(this Period period, int daysPerMonth)
{
    period = period.Normalize();
    int extraMonths = days / daysPerMonth;
    int months = period.Months + extraMonths;
    int extraYears = months / 12;
    // Simplest way of changing just a few parts...
    var builder = period.ToBuilder();
    builder.Years += extraYears;
    builder.Months = months % 12;
    builder.Days = days % daysPerMonth;
    return builder.Build();
}


因此,在您的情况下,听起来您可能想要:

objTotalPeriod = objTotalPeriod.NormalizeIncludingMonths(31);


请注意,使用此算法进行算术运算可能会产生“奇数”结果,这是日历算术性质的一部分。

关于c# - 在nodatime上添加两个周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44276026/

10-08 21:31