@@ -104,8 +104,8 @@ name _private @class counter1 my_function
104104
105105| Token | 类型 | 说明 |
106106| -------| ------| ------|
107- | ` + ` | 算术 | 加法 / 字符串拼接 / 数组拼接 |
108- | ` - ` | 算术 | 减法 / 一元取负 |
107+ | ` + ` | 算术 | 加法 / 字符串拼接 / 数组拼接 / 日期时间运算 |
108+ | ` - ` | 算术 | 减法 / 一元取负 / 日期时间运算 |
109109| ` * ` | 算术 | 乘法 / 字符串重复 |
110110| ` / ` | 算术 | 除法 |
111111| ` % ` | 算术 | 取模 |
@@ -218,6 +218,27 @@ let user = { name, age } // 等价于 { name = name, age = age }
218218}
219219```
220220
221+ ### 3.6 日期时间
222+
223+ SereinScript 提供 ` DateTimeValue ` 类型用于表示日期时间。由于没有日期字面量语法,需通过内置函数创建:
224+
225+ ``` js
226+ let now = now () // 当前本地时间 → DateTimeValue
227+ let dt = date (" 2025-06-15 12:00:00" ) // 解析字符串 → DateTimeValue
228+ ```
229+
230+ ` DateTimeValue ` 内部以 UTC 存储,显示时自动转为本地时间。支持 ` + ` ` - ` 运算符与 ` TimeSpanValue ` 进行算术运算(参见 [ §5.4] ( #54-日期时间运算 ) ),通过 ` . ` 访问属性(参见 [ §10.4] ( #104-日期时间 ) )。
231+
232+ ### 3.7 时间跨度
233+
234+ ` TimeSpanValue ` 表示一段时间的长度(差值),通常由 ` DateTimeValue - DateTimeValue ` 或 ` timespan() ` 函数产生:
235+
236+ ``` js
237+ let ts = timespan (3 , " days" ) // 3天 → TimeSpanValue
238+ let diff = date (" 2025-06-20" ) - date (" 2025-06-15" ) // → TimeSpanValue (5天)
239+ diff .totalDays // → 5.0
240+ ```
241+
221242---
222243
223244## 4. 变量与赋值
@@ -308,7 +329,42 @@ obj?.child?.prop = value // 安全空成员赋值
308329[1 , 2 ] + [3 , 4 ] // → [1, 2, 3, 4](拼接)
309330` ` `
310331
311- ### 5.5 比较运算
332+ ### 5.5 日期时间运算
333+
334+ ` DateTimeValue` 和 ` TimeSpanValue` 支持 ` + ` ` - ` 运算符:
335+
336+ ` ` ` js
337+ // DateTimeValue + TimeSpanValue → DateTimeValue
338+ date (" 2025-06-01" ) + timespan (7 , " days" ) // → 2025/06/08 00:00:00
339+
340+ // TimeSpanValue + DateTimeValue → DateTimeValue (交换律)
341+ timespan (12 , " hours" ) + now () // → 12小时后的时间
342+
343+ // TimeSpanValue + TimeSpanValue → TimeSpanValue
344+ timespan (1 , " days" ) + timespan (6 , " hours" ) // → 1.06:00:00
345+
346+ // DateTimeValue - TimeSpanValue → DateTimeValue
347+ date (" 2025-06-15" ) - timespan (5 , " days" ) // → 2025/06/10 00:00:00
348+
349+ // DateTimeValue - DateTimeValue → TimeSpanValue
350+ date (" 2025-06-20" ) - date (" 2025-06-15" ) // → TimeSpanValue (5天)
351+
352+ // TimeSpanValue - TimeSpanValue → TimeSpanValue
353+ timespan (3 , " days" ) - timespan (1 , " days" ) // → 2.00:00:00
354+ ` ` `
355+
356+ 比较运算符同样支持:
357+
358+ ` ` ` js
359+ dt1 == dt2 // 等于(同一时刻)
360+ dt1 != dt2 // 不等于
361+ dt1 > dt2 // 晚于
362+ dt1 >= dt2 // 不早于
363+ dt1 < dt2 // 早于
364+ dt1 <= dt2 // 不晚于
365+ ` ` `
366+
367+ ### 5.6 比较运算
312368
313369` ` ` js
314370a == b // 等于
@@ -319,15 +375,15 @@ a > b // 大于
319375a >= b // 大于等于
320376` ` `
321377
322- ### 5.6 逻辑运算
378+ ### 5.7 逻辑运算
323379
324380` ` ` js
325381! flag // 逻辑非
326382a && b // 逻辑与(短路求值)
327383a || b // 逻辑或(短路求值)
328384` ` `
329385
330- ### 5.7 成员访问
386+ ### 5.8 成员访问
331387
332388` ` ` js
333389person .name // 属性访问
@@ -336,23 +392,23 @@ array.length // 内置属性
336392" hello" .toUpper () // 方法调用
337393` ` `
338394
339- ### 5.8 索引访问
395+ ### 5.9 索引访问
340396
341397` ` ` js
342398arr[0 ] // 数组索引
343399arr[i + 1 ] // 表达式索引
344400matrix[0 ][1 ] // 嵌套索引
345401` ` `
346402
347- ### 5.9 函数调用
403+ ### 5.10 函数调用
348404
349405` ` ` js
350406add (1 , 2 ) // 普通调用
351407makeAdder (1 )(2 )(3 ) // 链式调用(柯里化)
352408someFunction (arg1, arg2, arg3) // 多参数调用
353409` ` `
354410
355- ### 5.10 括号分组
411+ ### 5.11 括号分组
356412
357413` ` ` js
358414(a + b) * c // 改变默认优先级
@@ -694,7 +750,7 @@ run-import.script
694750
695751| 函数 | 签名 | 说明 |
696752|------|------|------|
697- | ` typeof ` | ` typeof (value)` | 返回值的类型字符串:` " number " ` , ` " string" ` , ` " bool " ` , ` " null" ` , ` " array" ` , ` " object" ` , ` " function" ` 等 |
753+ | ` typeof ` | ` typeof (value)` | 返回值的类型字符串:` " int " ` , ` " string" ` , ` " boolean " ` , ` " null" ` , ` " array" ` , ` " object" ` , ` " function" ` , ` " datetime " ` , ` " timespan " ` 等 |
698754| ` bool` | ` bool (value)` | 转换为布尔值 |
699755| ` double` | ` double (value)` | 转换为 double |
700756
@@ -706,11 +762,67 @@ run-import.script
706762| ` keys` | ` keys (obj)` | 返回对象的所有键列表 |
707763| ` len` | ` len (collection)` | 返回集合的长度 |
708764
709- ### 10.4 时间
765+ ### 10.4 日期时间
710766
711767| 函数 | 签名 | 说明 |
712768|------|------|------|
713- | ` now` | ` now ()` | 返回当前时间戳(单位:100ns ticks,即 DateTime.Ticks) |
769+ | ` now` | ` now ()` | 返回当前本地时间,类型为 ` DateTimeValue` 。示例:` 2026 / 06 / 11 13 : 30 : 00 ` |
770+ | ` date` | ` date (str)` | 解析日期字符串为 ` DateTimeValue` 。无时区标记按本地时间处理。示例:` date (" 2025-02-05 12:00:12" )` |
771+ | ` timespan` | ` timespan (num, unit)` | 从数量+单位构造 ` TimeSpanValue` 。` unit` 支持:` " days" ` , ` " hours" ` , ` " minutes" ` , ` " seconds" ` , ` " milliseconds" ` , ` " ticks" ` |
772+
773+ #### 日期时间操作
774+
775+ ` DateTimeValue` 和 ` TimeSpanValue` 通过 ` + ` ` - ` 运算符实现算术运算:
776+
777+ ` ` ` js
778+ let dt = date (" 2025-06-15" )
779+ let ts = timespan (3 , " days" )
780+
781+ let later = dt + ts // → DateTimeValue (3天后)
782+ let sooner = dt - ts // → DateTimeValue (3天前)
783+
784+ let dt2 = date (" 2025-06-20" )
785+ let diff = dt2 - dt // → TimeSpanValue (日期差)
786+ diff .totalDays // → 5.0
787+
788+ // 比较
789+ dt2 > dt // → true
790+ ` ` `
791+
792+ #### DateTimeValue 属性与方法
793+
794+ | 成员 | 类型 | 说明 |
795+ |------|------|------|
796+ | ` .year ` | ` int` | 年 (1-9999) |
797+ | ` .month ` | ` int` | 月 (1-12) |
798+ | ` .day ` | ` int` | 日 (1-31) |
799+ | ` .hour ` | ` int` | 小时 (0-23) |
800+ | ` .minute ` | ` int` | 分钟 (0-59) |
801+ | ` .second ` | ` int` | 秒 (0-59) |
802+ | ` .millisecond ` | ` int` | 毫秒 (0-999) |
803+ | ` .dayOfWeek ` | ` int` | 星期几 (0=周日, 6=周六) |
804+ | ` .dayOfYear ` | ` int` | 一年中的第几天 (1-366) |
805+ | ` .ticks ` | ` long` | Tick 计数 (100ns 单位) |
806+ | ` .toString ()` | ` string` | 默认格式 ` yyyy/ MM / dd HH : mm: ss` |
807+ | ` .toString (format)` | ` string` | 自定义格式,如 ` d .toString (" yyyy-MM-dd" )` |
808+
809+ #### TimeSpanValue 属性与方法
810+
811+ | 成员 | 类型 | 说明 |
812+ |------|------|------|
813+ | ` .days ` | ` int` | 天数部分(整数) |
814+ | ` .hours ` | ` int` | 小时部分 (0-23) |
815+ | ` .minutes ` | ` int` | 分钟部分 (0-59) |
816+ | ` .seconds ` | ` int` | 秒部分 (0-59) |
817+ | ` .milliseconds ` | ` int` | 毫秒部分 (0-999) |
818+ | ` .totalDays ` | ` double` | 总天数(含小数) |
819+ | ` .totalHours ` | ` double` | 总小时数(含小数) |
820+ | ` .totalMinutes ` | ` double` | 总分钟数(含小数) |
821+ | ` .totalSeconds ` | ` double` | 总秒数(含小数) |
822+ | ` .totalMilliseconds ` | ` double` | 总毫秒数(含小数) |
823+ | ` .ticks ` | ` long` | Tick 计数 (100ns 单位) |
824+ | ` .toString ()` | ` string` | TimeSpan 标准格式 |
825+ | ` .toString (format)` | ` string` | 自定义格式 |
714826
715827### 10.5 对象/数组操作
716828
0 commit comments