C# 在nodatime上添加两个句点

C# 在nodatime上添加两个句点,c#,asp.net,nodatime,C#,Asp.net,Nodatime,其中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

其中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();
int intDays=0;
for(int i=0;i
您应该查看描述算术的野田佳彦时间用户指南-查看“添加句点”部分以了解更多信息


用一个例子来思考这一点是最容易混淆的。假设我们在2011年1月30日加上“一个月减去三天”:

Period period = Period.FromMonths(1) - Period.FromDays(3);
LocalDate date = new LocalDate(2011, 1, 30);
date = date + period;
如果你把这个谜题交给一个真实的人,他们很可能会等到最后一刻才检查答案的有效性,从而得出“2月27日”的答案。野田佳彦时间将于2月25日给出答案,因为上述代码有效评估为:

Period period = Period.FromMonths(1) - Period.FromDays(3);
LocalDate date = new LocalDate(2011, 1, 30);
date = date + Period.FromMonths(1); // February 28th (truncated)
date = date - Period.FromDays(3); // February 25th
这种方法的好处是简单性和可预测性:当你知道规则时,很容易计算出野田佳彦会做什么缺点是,如果你不知道规则,它看起来像是被打破了。


用你的代码 根据文档,您得到的结果是基于“规则”的预期行为。简单地说,您在两个时段的加法操作将计算为:

Years (2 + 0) = 2
Months(1 + 8) = 9
Days (28 + 30) = 58
您的评论:
此结果没有错误,但是否有任何方法可以正确地为上述代码添加天数。

“正确”是什么意思?你是说28+30=58不正确吗?


选择 用这个

public static Period add(Period b, Period c)
{

   int years = b.year + c.year;
   int months = b.month + c.month;
   int days= b.days + c.days;
   return new PeriodBuilder { Days = days, Months = months , Years  = years}.Build();
}

听起来你在寻找一些东西来规范月和日(和周?)。现有的
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);


请注意,使用此选项的算术可能会产生“奇数”结果,这也是日历算术的一部分。

用户明确询问如何使用NodaTime。我不想添加两个日期。我想添加两个句点对象。老兄,我不想在特定日期添加天、年或月。我只想添加两个periods对象,比如Period+Period。@PratikGhag
一个月只能有30天
:这完全是绝对的false@PratikGhag-使用底部的替代解决方案,只需设定一个条件,当
天>=30时,则
月+++
您不能使用Period objPeriod=new Period(),它将抛出异常。period或类似的东西没有构造函数。它不会在
period
类之外编译-您不能创建在完全不同的类上工作的运算符。此外,
Period
类已经有了一个
+
操作符,它可以实现这一点-您还没有解决规范化方面的问题。为什么您认为58天==1个月和28天?一个月(公历)可以是28到31天。根据客户的需要,需要考虑一个月30天:-} PraskgHag:我们是如何猜测这个问题的?既然如此,为什么代码中要除以31?你的客户是否明白,如果他们增加360天,他们最终会增加一年,“损失”5天?我认为你应该向客户解释日历算法比这复杂一点,并试图弄清他们真正想要实现的目标。你好@JonSkeet,对不起,我的错,现在是30而不是31。我的问题超出了原问题的范围。我只想以年、月、日的形式计算多个持续时间的总时间(比如在多个地点工作的人的工作经验)。简言之,我所做的是计算每个持续时间的总天数,然后将每个持续时间的天数相加,得到总天数,然后应用上述给定的解决方案得到结果。@Pratik:你当然可以编写自己的归一化代码。你可以把它变成一种扩展方法——你只需要知道你最终会得到奇怪的结果,比如一年372天……再次感谢@jon skeet。你能简单地解释一下它到底做了什么吗'objPeriod=objPeriod.Normalize();'@PratikGhag:它调用了
Normalize
方法,该方法将对所有固定长度的部分进行规范化,因此它将“25小时”转换为“1小时1天”。但它不会将14个月转换为1年2个月?。它会准时工作吗?@PratikGhag:它不会对年/月做任何事情,不会(部分原因是日历系统并不总是一年有12个月)。它会将周转换为天。基本上,请阅读文档:)
objTotalPeriod = objTotalPeriod.NormalizeIncludingMonths(31);