将两个DateTime对象相加有没有比DateTimefirst=newDateTime(2000,1,1)更好的方法将一个DateTime对象相加到另一个对象中?DateTimesecond=newDateTime(11,2,5,10,10,11);日期时间结果=first.AddYears(second.Year);日期时间结果=first.AddMonths(second.Month);...等...在这个例子中我想得到DateTime(2011,3,6,10,10,11)编辑经过密集的头脑风暴,似乎没有任何不同的方式,但为了方便起见包装在一个额外的类和运算符中,像JonSkeet的答案中那样将两个DateTime值加在一起是没有意义的。如果你想表示“11年、2个月、5天、10小时、10分钟和11秒”,那么你应该表示它。这与0011-02-05T10:10:11不同。特别是,您永远不能添加“2个月零30天”。另外,你永远不能添加年份,因为你不能在一个日期内有0的月份和日期值。现在并不知道BCL类型代表“11年的[...]”,但您可以相当轻松地创建自己的类型。作为替代方案,您可以使用我的NodaTime项目,其中包括用于此目的的Period:varlocalDateTime=newLocalDate(2000,1,10).AtMidnight();varperiod=newPeriodBuilder{Years=11,Months=2,Days=5,Hours=10,Minutes=10,Seconds=11}.Build();varresult=localDateTime+period;与此处提供的其他一些答案相反,您不能将TimeSpan用于此目的。TimeSpan没有任何月份和年份的概念,因为它们的长度各不相同,而TimeSpan表示固定数量的刻度。(如果你最大的单位是天,那么你可以使用TimeSpan,但考虑到你的例子,我认为你需要几个月TimeSpan年。)如果你不想使用NodaTime,我建议你自己伪造一个类似Period的类。这很容易做到–例如://未经测试,很快就被破解了。更多您可能想要的API,字符串转换、属性等。publicPeriod(intyears,intmonths,intdays,inthours,intminutes,intseconds){this.years=years;this.months=月数;这天=天;this.hours=小时;this.minutes=分钟;this.seconds=seconds;}publicstaticDateTimeoperator+(DateTimelhs,Periodrhs){//注意:操作顺序在这里很重要。//考虑1月1日+(1个月零30天)...//你希望结果是什么?返回lhs.AddYears(rhs.years).AddMonths(rhs.months).AddDays(rhs.days).AddHours(rhs.hours).AddMinutes(rhs.minutes).AddSeconds(rhs.seconds);}}用法:DateTimefirst=newDateTime(2000,1,1);第二期=新时期(11、2、5、10、10、11);日期时间结果=第一+第二;您需要了解DateTime.Add将如何处理不可能的情况–例如,在1月31日上加一个月会得到2月28日/29日,这取决于它是否是闰年(加年,然后加月),如果不需要-例如,“2月29日+1年+1个月”在逻辑上可能是“3月29日”,但实际上最终变成了“3月28日”,因为2月28日将在添加月份之前发生。试图找出一种“正确”的日历算术方法非常困难,尤其是在某些情况下,人们可能对“正确”的答案是什么持不同意见。在上面的代码中,我选择了简单性和可预测性——根据您的实际需要,您可能需要更复杂的东西。您有一个代表时间点的DateTime。并且您想为其添加年/月/日/小时/分钟/秒。DataTime的变化不是一个点,它是一个向量(点之间的差异)。很容易将一个误认为另一个,因为它们通常具有相似的结构。但是,这种类型错误会造成很多痛苦。避免它不会解决你的痛苦,但它可以使它易于管理。将两个DateTimes相加就是将两个点相加。有点像将洛杉矶位置添加到纽约。现在,将LA到NewYork到London的“向量”相加是有道理的——因为旅行向量是一个向量,而不是一个点。点+向量只是一个点。所以这意味着你需要创建一个时间向量类型。一个简单的时间跨度是一种选择,但可能不合适:因为您关心月、年和日,而不是纳秒或绝对持续时间。我将从CalendarVector中复制向量的名称,因为它代表日历上的运动,而不是时间本身。一个简单的第一步是创建每个时间子类型的元组——年、月、日等——然后使用重载的operator+以任意顺序将它们添加到原始DateTime。您应该支持:DateTime=DateTime+CalendarVectorCalendarVector=CalendarVector+CalendarVectorCalendarVector=CalendarVector-CalendarVectorCalendarVector=int*CalendarVectorCalendarVector=-CalendarVectorDateTime=DateTime-CalendarVectorCalendarVectorateTime=DateTime理想情况下。CalendarVector+DateTime重载是可选的,但可能不是必需的。然而,这只会让你走到一半。剩下的最大问题是CalendarVector加法不会通勤。将1个月添加到DateTime,然后添加1天,与添加1天然后添加1个月不同。这是至关重要的。“1月31日之后1个月是什么意思”这个问题存在并且可以回答,但对该问题的任何合理回答都没有解决通勤问题。您计划的构造函数——您在其中提供年数、月数、天数、小时数、分钟数——其含义不明确。所以一个健壮的解决方案不应该有那个构造函数。解决方案是创建明确添加的Years、Months、Days、Hours、Minutes和Seconds类型。它们相加的顺序是它们应用于您将它们添加到的DateTime的顺序。在日期时间的最终应用之前避免通勤和“简化”-所以+1年、+2天、-1个月、-1年、-2天、+1个月不是零转换。DateTime-DateTime有一个相关的问题-它应该返回一个CalendarVectorv使得lhs=rhs+v,但是有多个这样的向量。球坐标可能会出现同样的问题——你是指地球周围的短路还是长途?在某些情况下这无关紧要-但您将结果减半以找到中间点。此外,当你接近“世界的另一边”时,你会体验到不连续性。所以我的建议是维护一个DateTime对象的转换列表。1year是一种转换,涉及将1添加到年份字段,然后修复其他字段以使其保持一致。这些转变支持否定。增加是从左到右一次应用一个。负数也可能颠倒应用顺序,“相同类型”的相邻转换可能会合并(因此+1个月-1个月成为恒等转换,而不是基于下个月末的钳位操作),或者不是(所以x=x+1month,然后是下一行x=x-1month和x=x+1month-1month)。另一种方法是坚持用户提供的在这些特殊情况下做什么的策略(这种情况一直发生),因为问题非常棘手,“解决”问题的库最多只能突出问题并强制执行客户端程序员去思考它们并做出决定。以上就是C#学习教程:将两个DateTime对象共享的所有内容加在一起。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
