You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jsonLogic.Net通过规则比较日期?无需解析输入数据

解决jsonLogic.Net中日期比较的问题

自定义日期比较操作符

jsonLogic.Net本身没有内置日期比较操作,但支持扩展自定义操作符,这是最直接的方案——无需在外部代码里解析输入日期,所有日期处理逻辑都封装在自定义操作中:

  1. 注册自定义操作符
var logic = new JsonLogic();
// 注册"date_greater_than"操作符:第一个参数是输入日期,第二个是规则定义的日期
logic.AddOperation("date_greater_than", (args) => {
    if (args.Count != 2) return false;
    // 解析输入日期(从数据中取的字段)和规则里的日期
    if (DateTime.TryParse(args[0]?.ToString(), out DateTime inputDate) &&
        DateTime.TryParse(args[1]?.ToString(), out DateTime ruleDate))
    {
        return inputDate > ruleDate;
    }
    return false; // 解析失败时返回false或自定义逻辑
});

// 同理可注册date_less_than、date_equal等操作符
  1. 使用自定义操作符的规则示例
{
  "date_greater_than": [{"var": "inputDate"}, "2024-01-01"]
}

这里{"var": "inputDate"}直接引用输入数据中的日期字段,规则里的日期字符串会在自定义操作中自动解析比较,无需外部提前处理输入数据。

利用时间戳转换+数值比较

如果不想自定义操作符,也可以把日期转成Unix时间戳,用jsonLogic内置的数值比较操作(>、<、==)来实现:

  1. 扩展转时间戳的操作符
logic.AddOperation("to_timestamp", (args) => {
    if (args.Count != 1) return 0;
    if (DateTime.TryParse(args[0]?.ToString(), out DateTime date))
    {
        return new DateTimeOffset(date).ToUnixTimeSeconds();
    }
    return 0;
});
  1. 规则中转换后比较
{
  ">": [
    {"to_timestamp": {"var": "inputDate"}},
    {"to_timestamp": "2024-01-01"}
  ]
}

这种方式同样不需要在外部解析输入数据,所有转换和比较都在规则执行时完成。

结合当前日期的场景

如果需要和当前日期比较,直接在自定义操作中使用DateTime.Now或DateTime.UtcNow即可,比如注册一个date_after_today操作符:

logic.AddOperation("date_after_today", (args) => {
    if (args.Count != 1) return false;
    if (DateTime.TryParse(args[0]?.ToString(), out DateTime inputDate))
    {
        return inputDate.Date > DateTime.Today;
    }
    return false;
});

规则示例:

{"date_after_today": {"var": "inputDate"}}

内容的提问来源于stack exchange,提问作者A.Ghaffar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:50:02