【A11】时间区间(Time Range)

发布时间:2026/9/16 4:24:38

【A11】时间区间(Time Range) 核心语义基于左闭右开区间语义[start, end)start本次时间间隔的起始点包含也是本次版次的最小时间点end下次版次的最小时间点不包含即本次区间的上界结构体定义/// 时间区间 [start, end)#[derive(Copy, Clone, Debug, PartialEq)]pubstructTimeRange{start:DateTime,end:DateTime,}构造器方法注意除from_start_to_now和from_now_to_end外所有构造器均为const函数可在编译时求值。new(start, end)—const创建区间[start, end)。pubconstfnnew(start:DateTime,end:DateTime)-Self{debug_assert!(start.lt(end),TimeRange::new: start must be end);Self{start,end}}示例letrTimeRange::new(today_start,tomorrow_start);// 包含today_start ≤ t tomorrow_startfrom_start_to_now(start)— 非const构造从起始时间到现在的区间[start, now 1ms]包含 now。pubfnfrom_start_to_now(start:DateTime)-Self{Self::new(start,DateTime::now().ms(1))}示例letrTimeRange::from_start_to_now(last_sync);// 包含last_sync ≤ t ≤ nowfrom_now_to_end(end)— 非const构造从现在到指定时间的区间[now, end)。pubfnfrom_now_to_end(end:DateTime)-Self{Self::new(DateTime::now(),end)}示例letrTimeRange::from_now_to_end(deadline);// 包含now ≤ t deadlinepoint(at)—const构造仅包含单个时间点的区间[at, at1ms)。pubconstfnpoint(at:DateTime)-Self{Self::new(at,at.ms(1))}示例letrTimeRange::point(snapshot_time);// 仅包含t snapshot_timefrom_start_duration(start, duration)—const从起始时间和时长创建区间。pubconstfnfrom_start_duration(start:DateTime,duration:Duration)-Self{Self::new(start,start.add(duration))}示例letrTimeRange::from_start_duration(start,Duration::from_hours(2));// 包含[start, start 2h)from_end_backward(end, duration)—const从结束时间和时长向前创建区间[end - duration, end)。pubconstfnfrom_end_backward(end:DateTime,duration:Duration)-Self{Self::new(end.sub(duration),end)}示例letrTimeRange::from_end_backward(end,Duration::from_hours(2));// 包含[end - 2h, end)查询方法所有查询方法均为const函数。implTimeRange{/// 获取起始时间点包含pubconstfnstart(self)-DateTime{self.start}/// 获取结束时间点不包含pubconstfnend(self)-DateTime{self.end}/// 计算区间跨度时长pubconstfnduration(self)-Duration{self.end.diff(self.start)}/// 将区间转换为 (start, end) 元组pubconstfnto_parts(self)-(DateTime,DateTime){(self.start,self.end)}}判断方法所有判断方法均为const函数。implTimeRange{/// 判断某个时间点是否在区间内pubconstfncontains(self,t:DateTime)-bool{self.start.le(t)t.lt(self.end)}/// 判断是否包含另一个区间pubconstfncontains_range(self,other:Self)-bool{self.start.le(other.start)other.end.le(self.end)}/// 判断两个区间是否相邻pubconstfnis_adjacent_to(self,other:Self)-bool{self.end.eq(other.start)||other.end.eq(self.start)}/// 合并相邻区间必须首尾相接不支持重叠pubconstfnmerge(self,other:Self)-OptionSelf{ifself.end.eq(other.start){Some(TimeRange::new(self.start,other.end))}elseifself.start.eq(other.end){Some(TimeRange::new(other.start,self.end))}else{None}}}类型转换所有From/Into实现均非constRust 稳定版暂不支持consttrait。implFrom(DateTime,DateTime)forTimeRange{fnfrom((start,end):(DateTime,DateTime))-Self{Self::new(start,end)}}implFromTimeRangefor(DateTime,DateTime){fnfrom(range:TimeRange)-Self{(range.start,range.end)}}implFromRangeDateTimeforTimeRange{fnfrom(range:RangeDateTime)-Self{Self::new(range.start,range.end)}}implFromTimeRangeforRangeDateTime{fnfrom(range:TimeRange)-Self{range.start..range.end}}implFrom[DateTime;2]forTimeRange{fnfrom([start,end]:[DateTime;2])-Self{Self::new(start,end)}}implFromTimeRangefor[DateTime;2]{fnfrom(range:TimeRange)-Self{[range.start,range.end]}}使用示例letlast_syncDateTime::from_ymd(2026,8,18);letnowDateTime::now();// 构造区间letrangeTimeRange::from_start_to_now(last_sync);// [last_sync, now 1ms]// 检查包含关系assert!(range.contains(last_sync));// 起点包含assert!(range.contains(now));// now 包含assert!(!range.contains(now.ms(1)));// now 1ms 不包含右边界// 区间跨度letdurationrange.duration();// 相邻与合并letr1TimeRange::new(t1,t2);letr2TimeRange::new(t2,t3);ifletSome(merged)r1.merge(r2){// 合并后的区间覆盖 [t1, t3)}const 函数汇总方法分类方法名是否const构造器new✅point✅from_start_duration✅from_end_backward✅from_start_to_now❌依赖DateTime::now()from_now_to_end❌依赖DateTime::now()查询start✅end✅duration✅to_parts✅判断contains✅contains_range✅is_adjacent_to✅merge✅类型转换所有From/Into❌Rust 稳定版限制设计要点概念说明start区间起始时间点包含本次版次的最小时间点end区间结束时间点不包含下次版次的最小时间点有效区间[start, end)即start ≤ t end存储形式自定义结构体TimeRange包含start和end两个字段包含 nowfrom_start_to_now(start)使用now.ms(1)作为结束边界使now被包含相邻合并end other.start或other.end start仅相邻可合并重叠不可合并const 支持除涉及now()的构造器和类型转换外所有方法均为const一句话总结start是本次版次的最小时间点包含end是下次版次的最小时间点不包含。区间[start, end)使用from_start_to_now(start)包含now时end now.ms(1)。
延伸阅读

更多相关文章

2026/9/16 0:01:21

生产管理系统和WMS有什么区别?制造企业怎么搭配?

本文要点 本文澄清制造企业在生产管理系统与 WMS(仓储管理系统)选型上常见的概念误区,以某 PCB 设备企业大规模搭建业务流程的真实案例为参照,讲清两者边界与搭配方式。文章逐条澄清"WMS 能管排程"、“生产系统自带完整…

2026/9/16 10:18:01

JVM与多线程面试核心要点解析

1. 为什么JVM与多线程成为校招面试的"重灾区"?每年校招季,我都会参与公司的Java技术面试工作。一个明显的现象是:近90%的应届生在JVM和多线程这两个核心领域表现欠佳。这并非偶然——JVM涉及内存管理、类加载机制等底层原理&#x…

2026/9/12 22:07:29

AI Agent行为诊断框架:从可观测性到根因分析的工程实践

1. 项目概述:为什么我们需要一个AI Agent诊断框架?最近在折腾AI Agent项目时,我遇到了一个非常典型的问题:Agent在测试环境中运行良好,但一到生产环境,面对更复杂的用户输入和任务链,就开始出现…

2026/9/16 13:51:09

Agent Zero 零配置快速上手指南

Agent Zero 零配置快速上手指南 【免费下载链接】agent-zero Agent Zero AI framework 项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero 凌晨 3 点没人盯数据,调研靠复制粘贴熬到天亮?Agent Zero 是开源 AI 智能体框架(…

2026/9/16 13:46:07

AI表格助手:自然语言处理与数据分析的革新

1. 项目概述:当表格处理遇上AI助手最近上线了一款名为"表答"的小程序,主打用AI技术解决日常表格处理和数据分析的痛点。作为一个常年和Excel、Google Sheets打交道的从业者,我第一时间做了深度测试。这个小程序的核心理念很明确——…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码