C# 如何将句点移到比较的另一边?

C# 如何将句点移到比较的另一边?,c#,.net,period,nodatime,C#,.net,Period,Nodatime,说到s,-不应该是+的倒数:3月31日加上一个月就会产生4月30日。从4月30日减去一个月,得到的是3月30日,而不是3月31日 我有一个涉及句点的数据库记录过滤器: priorDate + period < today 这允许将比较从客户端移动到数据库:它允许我避免检索所有记录而丢弃不符合条件的记录 如果该期间涉及数月或数年,我该怎么做 我可以假设公历,期间为非负数。(特别是:我可以假设priorDate+period>=priorDate的所有值都是priorDate,但如果可能的话

说到s,
-
不应该是
+
的倒数:3月31日加上一个月就会产生4月30日。从4月30日减去一个月,得到的是3月30日,而不是3月31日

我有一个涉及句点的数据库记录过滤器:

priorDate + period < today
这允许将比较从客户端移动到数据库:它允许我避免检索所有记录而丢弃不符合条件的记录

如果该期间涉及数月或数年,我该怎么做

我可以假设公历,
期间
为非负数。(特别是:我可以假设
priorDate+period>=priorDate
的所有值都是
priorDate
,但如果可能的话,我还不排除“一个月减去一天”的周期。)

如果我有一个月的期限,今天是4月30日,那么我想计算一下表达式应该变成
priorDate
,这很简单:这就是
今天-period
产生的结果


如果我有一个月的期限,今天是2018年3月30日,那么
今天-period
将产生2月28日,但是表达式应该变成3月1日的比较:如果
priorDate
正好是
新的LocalDate(2018,2,28)
,那么
priorDate+period
将为真,但是
priorDate
将为假。

给定
LocalDate
d
期间
p

如果
p
仅包括月份或年份:

  • 如果对
    p
    进行简单的加减操作会产生一个无效的日期,则结果会减少到月末。结果日期永远不会“向上舍入”到下个月。它的年/月组成部分将按照
    p
    中指定的金额精确增加。因此:

    • d-p
      将产生最低的
      x
      ,从而
      x+p==d
      ,如果存在这样的
      x

      在这种情况下,
      v+p
      相当于
      v
    • 否则,
      d-p
      将产生最大的
      x
      ,从而
      x+p


      在这种情况下,
      v+p
      相当于
      v根本不清楚你在问什么。首先,这些是什么数据类型。下一步-为了安全起见,请始终明确您的优先需求,即执行
      priorDateTime<(现在-期间)
      @pm100我已标记了此[nodatime],但现在已编辑为包含链接。括号显然不会有任何区别。你需要时间(小时-分钟)信息还是天数足够好?@FrancescoB。我认为几天就足够了,但老实说,我还不能完全确定。
      priorDate < today - period
      
      LocalDate F(Period period, LocalDate refDate)
      {
        var result = refDate - period;
        if (result + period != refDate)
          result += Period.FromDays(1);
        return result;
      }
      
      LocalDate G(Period period, LocalDate refDate)
      {
          var result =
              refDate
              - new PeriodBuilder {Weeks = period.Weeks, Days = period.Days}.Build()
              - new PeriodBuilder {Years = period.Years, Months = period.Months}.Build();
          if (result + period != refDate)
              result += Period.FromDays(1);
          return result;
      }