其中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/