JSONata日期时间函数详解:从基础到高级应用
前言
在数据处理和转换过程中,日期和时间的处理是非常常见的需求。JSONata作为一款强大的JSON数据转换语言,提供了一系列实用的日期时间处理函数。本文将全面介绍JSONata中的日期时间函数,帮助开发者掌握这些核心功能。
基础时间获取函数
$now() 函数
$now()
函数用于获取当前的UTC时间戳,返回ISO 8601格式的字符串。这个函数的特点是:在同一个表达式求值过程中多次调用时,返回的时间戳值保持不变。
基本用法:
$now()
返回示例:"2023-07-20T08:30:45.123Z"
高级用法: 可以配合格式字符串和时区参数使用:
$now('[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]', '+0800')
这会返回类似"2023-07-20 16:30:45"
的格式(北京时间)
$millis() 函数
$millis()
返回自Unix纪元(1970年1月1日UTC)以来的毫秒数,作为一个数字值。与$now()
类似,同一表达式求值过程中多次调用返回相同值。
示例:
$millis()
可能返回:1689844245123
时间转换函数
$fromMillis() 函数
$fromMillis()
是将毫秒数转换为格式化日期字符串的核心函数。
基本语法:
$fromMillis(milliseconds [, picture [, timezone]])
参数说明:
milliseconds
: 必填,Unix时间戳毫秒数picture
: 可选,格式化字符串timezone
: 可选,时区偏移量,格式为"±HHMM"
使用场景:
- 简单转换(ISO格式):
$fromMillis(1510067557121)
返回:"2017-11-07T15:12:37.121Z"
- 自定义格式:
$fromMillis(1510067557121, '[M01]/[D01]/[Y0001] [h#1]:[m01][P]')
返回:"11/07/2017 3:12pm"
- 带时区转换:
$fromMillis(1510067557121, '[H01]:[m01]:[s01] [z]', '-0500')
返回:"10:12:37 GMT-05:00"
格式化字符串语法: 格式化字符串使用方括号包围的组件构成,常见组件包括:
[Y0001]
: 4位年份[M01]
: 2位月份[D01]
: 2位日期[H01]
: 24小时制小时[h#1]
: 12小时制小时[m01]
: 分钟[s01]
: 秒[f001]
: 毫秒[P]
: AM/PM标记
$toMillis() 函数
$toMillis()
是$fromMillis()
的逆操作,将日期字符串转换为毫秒时间戳。
基本语法:
$toMillis(timestamp [, picture])
使用示例:
- 解析ISO格式:
$toMillis("2017-11-07T15:07:54.972Z")
返回:1510067274972
- 解析自定义格式:
$toMillis("11/07/2017 3:07pm", '[M01]/[D01]/[Y0001] [h#1]:[m01][P]')
实际应用场景
- 日志时间格式化:
{
"rawTimestamp": log.timestamp,
"formatted": $fromMillis(log.timestamp, '[Y]-[M01]-[D01] [H01]:[m01]')
}
- 时区转换:
$fromMillis(event.time, '[H01]:[m01]', '+0800')
- 日期计算:
$fromMillis($toMillis("2023-01-01") + 86400000) // 加1天
- 多格式支持:
$toMillis(dateString,
dateString ~> /^\d{4}-\d{2}-\d{2}$/ ? '[Y0001]-[M01]-[D01]' :
dateString ~> /^\d{2}\/\d{2}\/\d{4}$/ ? '[M01]/[D01]/[Y0001]' :
'[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z'
)
注意事项
- 时区处理要特别注意,默认情况下使用UTC时区
- 格式化字符串区分大小写,如
[M01]
表示月份,[m01]
表示分钟 - 日期解析时,格式必须严格匹配,否则会抛出错误
- 性能考虑:频繁的时间转换操作可能会影响性能
总结
JSONata的日期时间函数提供了强大而灵活的时间处理能力,从简单的时间戳获取到复杂的格式转换都能轻松应对。掌握这些函数可以大大提升处理时间相关数据的效率,特别是在数据转换和报表生成等场景中。通过合理组合这些函数,可以实现几乎任何时间格式的输入输出需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考