如何使用jsonLogic.Net通过规则比较日期?无需解析输入数据
解决jsonLogic.Net中日期比较的问题
自定义日期比较操作符
jsonLogic.Net本身没有内置日期比较操作,但支持扩展自定义操作符,这是最直接的方案——无需在外部代码里解析输入日期,所有日期处理逻辑都封装在自定义操作中:
- 注册自定义操作符
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等操作符
- 使用自定义操作符的规则示例
{ "date_greater_than": [{"var": "inputDate"}, "2024-01-01"] }
这里{"var": "inputDate"}直接引用输入数据中的日期字段,规则里的日期字符串会在自定义操作中自动解析比较,无需外部提前处理输入数据。
利用时间戳转换+数值比较
如果不想自定义操作符,也可以把日期转成Unix时间戳,用jsonLogic内置的数值比较操作(>、<、==)来实现:
- 扩展转时间戳的操作符
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; });
- 规则中转换后比较
{ ">": [ {"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
相关产品推荐
相关产品推荐

