内置 SQL 函数
规则引擎提供了各种内置函数,您可以在 SQL 中使用这些函数实现基本的数据处理,包括:
在本章节中,所有函数的声明都遵循以下格式:
例如,
abs(X: integer | float) -> integer | float
意味着参数
X
的数据类型可以是 integer 或者 float,并且其返回值的数据类型同样可以是 integer 或 float。
注意,如果传入参数的值超出了限定范围或者使用了不支持的数据类型,将导致当前 SQL 执行失败,并使执行失败计数加 1。
提示
- 一些转义字符使用时需要进行反转义,参考 unescape 函数 。
- 从 EMQX 5.0 版本开始,EMQX 还支持使用 jq 语法 处理复杂的 JSON 数据,您可以阅读 jq 函数 部分了解更多信息。
数学运算函数
EMQX 支持广泛的数学函数:
- 三角函数和双曲函数,包括 sin、cos、tan、asin、acos、atan、sinh、cosh、tanh、asinh、acosh、atanh。
- 数值函数,包括 abs、ceil、floor、round、sqrt、fmod。
- 指数和对数函数,包括 exp、power、log、log10、log2。
abs(X: integer | float) -> integer | float
返回数字
X
的绝对值。
示例:
acos(X: integer | float) -> float
返回
X
的反余弦值,以弧度表示。
X
的取值范围为
[-1, 1]
。示例:
acosh(X: integer | float) -> float
返回
X
的反双曲余弦值,以弧度表示。
X
必须大于等于 1。示例:
asin(X: integer | float) -> float
返回
X
的反正弦值,以弧度表示。
X
的取值范围为
[-1, 1]
。示例:
asinh(X: integer | float) -> float
返回
X
的反双曲正弦值。示例:
atan(X: integer | float) -> float
返回
X
的反正切值,以弧度表示。示例:
atanh(X: integer | float) -> float
返回
X
的反双曲正切值,
X
的取值范围为
(-1, 1)
。示例:
ceil(X: integer | float) -> integer
向上舍入,返回大于等于给定
X
的最小整数。示例:
cos(X: integer | float) -> float
返回角度
X
(以弧度表示)的余弦值。示例:
cosh(X: integer | float) -> float
返回
X
的双曲余弦值。示例:
exp(X: integer | float) -> float
返回自然常数 e 的
X
次方,即
e^X
。示例:
floor(X: integer | float) -> integer
向下舍入,返回小于等于给定
X
的最大整数。示例:
fmod(X: integer | float, Y: integer | float) -> float
以浮点数形式返回
X
除以
Y
的余数。示例:
log(X: integer | float) -> float
返回数字
X
的自然对数,
X
必须大于 0。示例:
log10(X: integer | float) -> float
返回数字
X
以 10 为底的对数,,
X
必须大于 0。示例:
log2(X: integer | float) -> float
返回数字
X
以 2 为底的对数,,
X
必须大于 0。示例:
round(X: integer | float) -> integer
对数字
X
进行四舍五入,返回最接近的整数。示例:
power(X: integer | float, Y: integer | float) -> float
返回基数
X
的指数
Y
次幂,即
X^Y
。示例:
random() -> float
返回一个随机浮点数,范围是
[0, 1)
。示例:
sin(X: integer | float) -> float
返回角度
X
(以弧度表示)的正弦值。示例:
sinh(X: integer | float) -> float
返回
X
的双曲正弦值。示例:
sqrt(X: integer | float) -> float
返回数字
X
的平方根。示例:
tan(X: integer | float) -> float
返回角度
X
(以弧度表示)的正切值。示例:
tanh(X: integer | float) -> float
返回
X
的双曲正切值。示例:
数据类型判断函数
数据类型判断函数可用于检查指定字段的数据类型,并通过布尔值指示该字段是否符合指定的数据类型。
is_array(Term: any) -> boolean
any 表示所有数据类型。
判断
Term
是否为 array 类型。示例:
is_bool(Term: any) -> boolean
判断
Term
是否为 boolean 类型。示例:
is_float(Term: any) -> boolean
判断
Term
是否为 float 类型。示例:
is_int(Term: any) -> boolean
判断
Term
是否为 integer 类型。示例:
is_map(Term: any) -> boolean
判断
Term
是否为 map 类型。示例:
is_null(Term: any) -> boolean
判断变量
Term
是否未定义。 注意,is_null 函数只能用于判断变量是否未定义,不能用于判断变量是否为
null
。 示例:
is_null_var(Term: any) -> boolean
判断变量
Term
是否未定义,或者是
null
。示例:
is_not_null_var(Term: any) -> boolean
与
is_null_var
相反,判断变量
Term
是否已定义且不为
null
。
is_num(Term: any) -> boolean
判断
Term
是否为 integer 或 float 类型。示例:
is_str(Term: any) -> boolean
判断
Term
是否为 string 类型。示例:
数据类型转换函数
bool(Term: boolean | integer | string) -> boolean
将
Term
转换为 boolean 类型,Term 只能是 boolean 类型、integer 类型的 0 和 1,或者 string 类型的 ture 和 false。
示例:
float(Term: float | integer | string) -> float
将
Term
转换为 float 类型。
当
Term
为 string 类型时,可以使用科学计数法,例如
float('3.14e4')
。float 类型最多支持 16 位有效数字,如果字符串 Term 表示的浮点数的有效数字超过了 16 位时,转换可能出现舍入误差。
示例:
float(Term: float | integer | string, Decimals: integer) -> float
将 Term 转换成小数点后最多包含 Decimals 位数字的浮点数,Decimals 的取值范围为
(0, 253]
。其余行为与
float/1
相同。示例:
float2str(Float: float, Decimals: integer) -> string
将浮点数
Float
转换为小数点后最多包含
Decimals
位数字的字符串,字符串末尾的 0 将被截断。
Decimals
的取值范围为
[0, 253]
。如果 Float 的有效数字超过了 16 位,那么转换将可能出现舍入误差。
由于浮点数在计算机中无法精确存储,所以当
Decimals
大于
Float
的小数位数(包括前导零)时,
float2str
可能返回
Float
的二进制近似值的十进制形式。
示例:
int(Term: boolean | float | integer | string) -> integer
将
Term
转换为 integer 类型。
当
Term
为 boolean 类型时,ture 将被转换为数字 1,false 将被转换为数字 0。
当
Term
为 float 类型时,
Term
将被向下舍入,转换为小于等于
Term
的最大整数。
当
Term
为 string 类型时,
Term
必须至少包含一个数字字符,可以具有单个
+
或
-
字符组成的可选前缀,前导零将被忽略。支持使用数学计数法表示。
当
Term
为 integer 类型时,
Term
将原样返回。
示例:
str(Term: any) -> string
将任意类型的
Term
转换为 string 类型。
当
Term
为 map 或 array 类型时,str 函数将尝试对
Term
进行 JSON 编码。
当
Term
为 float 类型时,str 函数将返回对应的字符串,字符串末尾的 0 将被截断。返回的字符串在小数点后最多包含 10 位数字,如果想要返回更多小数位,请使用 float2str 函数。
示例:
字符串操作函数
字符串函数可用于对字符串的大小写转换、空格删除、子串截取、转义/反转义、替换等处理。
ascii(Char: string) -> integer
返回字符 Char 对应的 ASCII 编号,如果 Char 包含多个字符,仅返回第一个字符的对应编号。示例:
concat(Str1: string, Str2: string) -> string
将 Str1 和 Str2 合并为一个字符串。示例:
find(String: string, SearchPattern: string) -> string
在 String 中查找子串 SearchPattern,删除 String 中 SearchPattern 之前的所有内容,并返回字符串中的其余部分。如果未找到 SearchPattern,则返回一个空字符串。同
find(String, SearchPattern, 'leading')
示例:
find(String: string, SearchPattern: string, Direction: string) -> string
同
find/2
,但可以使用 Direction 指定查找子串 SearchPattern 的方向。示例:
join_to_string(Sep: string, Array: array) -> string
将数组 Array 中的所有元素连接成一个字符串,元素之间使用 Sep 分隔。示例:
lower(String: string) -> string
将字符串 String 中的大写字母转换为小写字母。示例:
ltrim(String: string) -> string
同
trim/1
,但仅删除字符串 String 中前导的空白字符。示例:
pad(String: string, Length: integer) -> string
为 String 填充尾随空格,使其达到指定长度 Length。示例:
pad(String: string, Length: integer, Direction: string) -> string
同
pad/2
,但可以使用 Direction 指定空格填充的方向。leading 表示填充前导空格,trailing 表示填充尾随空格,both 表示同时填充前导和尾随空格。
指定 Direction 为 both 时,如果需要填充的空格数量为奇数,那么最后一个空格将被填充在尾部。
示例:
pad(String: string, Length: integer, Direction: string, Char: string) -> string
同
pad/3
,但可以使用指定字素簇 Char 进行填充。
由于规则引擎不检查 Char 是否是一个合法的字素簇,所以 Char 无论包含了多少字符,都会按一个字符长度处理。示例:
regex_match(String: string, Expression: string) -> boolean
判断字符串 String 是否与正则表示式 Expression 匹配。示例:
regex_replace(String: string, Expression: string, Replacement: string) -> string
使用字符串 Replacement 替换 String 中与正则表达式 Expression 匹配的部分。如果未找到匹配部分,则返回原始的 String。示例:
regex_extract(String: string, Expression: string) -> [string]
TIP
此函数在 EMQX v5.7.1 中引入。
这个函数在给定字符串中进行非全局搜索,查找带有捕获组的正则表达式模式。 它可以用来根据正则表达式提取字符串的部分内容,排除完整匹配本身。
如果找到匹配项,它将返回这些匹配项中所有捕获组的列表。如果没有找到匹配项或没有捕获到任何组,则返回一个空列表。
示例:
replace(String: string, SearchPattern: string, Replacement: string) -> string
将 String 中的所有 SearchPattern 都替换为 Replacement。示例:
replace(String: string, SearchPattern: string, Replacement: string, Where: string) -> string
将出现在 String 中的 SearchPattern 替换为 Replacement。
Where 有以下可取值:
-
all:替换所有的 SearchPattern,等同于
replace/3
。 - leading:仅替换前导 SearchPattern。
- trailing:仅替换尾随 SearchPattern。
示例:
reverse(String: string) -> string
反转字符串 String。示例:
rm_prefix(String: string, Prefix: string) -> string
从字符串 String 中删除前缀 Prefix。示例:
rtrim(String: string) -> string
同
trim/1
,但仅删除字符串 String 中尾随的空白字符。示例:
split(String: string, Separator: string) -> array
使用分隔符 Separator 将字符串 String 分割成子字符串并返回一个由这些子字符串组成的数组。
两个或多个相邻的 Separator 不会被视为一个,所以分割结果中可能包含空字符串。
split/2
默认对输出结果进行了修整,过滤了其中空字符串,如需保留,请使用
split(String, Separator, 'notrim')
。
Separator 可以由多个字符组成,但它们将被视为一个整体。如果想要一次指定多个分隔字符,请使用
tokens
函数。
示例:
split(String: string, Separator: string, Option: string) -> array
同
split/2
,但可以使用 Option 指定需要处理的分隔符的位置,以及是否需要返回空字符串。
Option 有以下可取值:
- notrim:处理字符串中的所有分隔符,返回的结果中可能包含空字符串。
- leading:仅处理前导的分隔符,返回的结果中不包含空字符串。
- leading_notrim:仅处理前导的分隔符,返回的结果中可能包含空字符串。
- trailing:仅处理尾随的分隔符,返回的结果中不包含空字符串。
- trailing_notrim:仅处理尾随的分隔符,返回的结果中可能包含空字符串。
示例:
sprintf(Format, ...) -> string
返回一个按照 Format 格式化的字符串。Format 字符串包含普通字符以及用于格式化的控制序列。
控制序列的格式一般为:
~F.P.PadModC
。
字符 C 确定要使用的控制序列的类型。这是唯一必填字段。 F、P、Pad 和 Mod 都是可选的。关于它们的详细介绍,请参阅: https://www.erlang.org/doc/man/io.html#fwrite-1。
示例:
strlen(String: string) -> integer
返回字符串 String 的长度。示例:
substr(String: string, Start: integer) -> string
返回 String 中从位置 Start 开始到字符串末尾的所有字符,字符串的下标从 0 开始,即位置 0 对应的是字符串 “hello” 中的 “h”。示例:
substr(String: string, Start: integer, Length: integer) -> string
返回 String 中从位置 Start 开始,最大长度为 Length 的子字符串,字符串的下标从 0 开始。示例:
tokens(String: string, SeparatorList: string) -> array
返回 String 被 SeparatorList 中的字符分割后的子串列表。
两个或多个相邻的分隔符将被视为一个,所以不会出现空字符串。
示例:
tokens(String: string, SeparatorList:string, NoCRLF: string) -> array
同
tokens/2
,但可以指定 NoCRLF 为 nocrlf 表示同时分割回车符和换行符。示例:
trim(String: string) -> string
删除字符串 String 中前导和尾随的应被视为空白的字符,例如空格、制表符、换页符及换行符。注意,在 Unicode 标准中
\r\n
被视为一个字素簇,所以
\r\n
会被一并被删除。示例:
unescape(String: string) -> string
反转义函数,用于将转义字符转换回它们表示的字符。当 SQL 中使用了转义字符时,需要首先使用该函数进行反转义才能正确使用。
TIP
此函数在 EMQX v5.7.0 中引入。
例如当 Payload 为换行字符串:
需要按照
\n
分割 Payload 为数组,如下 SQL 将无法按预期执行:
输出结果:
使用 unescape 函数对
\n
反转义后,可以得到期望的结果:
输出结果:
unescape 函数支持以下转义字符:
标准 C 转义序列:
-
\n
表示换行符(LF) -
\t
表示水平制表符(HT) -
\r
表示回车符(CR) -
\b
表示退格符(BS) -
\f
表示换页符(FF) -
\v
表示垂直制表符(VT) -
\'
表示单引号(') -
\"
表示双引号(") -
\\
表示反斜杠 -
\?
表示问号(?) -
\a
表示警告符(响铃符,BEL)
十六进制转义码:
-
\xH...
其中H...
是一个或多个十六进制数字(0-9, A-F, a-f),允许编码任意的 UTF-32 字符。
如果传入未识别的转义符,或者十六进制转义码包含无效的 Unicode 字符,则该函数将抛出异常。
upper(String: string) -> string
将字符串 String 中的小写字母转换为大写字母。示例:
映射操作函数
map_get(Key: string, Map: map) -> any
返回 Map 中指定 Key 的值,如果该 Key 在 Map 中不存在,则返回
undefined
。示例:
map_get(Key: srting, Map: map, Default: any) -> any
同
map_get/2
,但 Key 不存在时,将返回指定的 Default。示例:
map_keys(Map: map) -> array
返回 Map 中所有的 Key。示例:
map_put(Key: string, Value: any, Map: map) -> map
将 Key 与关联的 Value 插入到 Map 中,返回更新后的 Map。如果原始 Map 中该 Key 已经存在,那么旧的关联值将被替换为新的 Value。示例:
map_to_redis_hset_args(Map) -> list
TIP
此函数在 EMQX v5.7.1 中引入。
此函数将映射转换为字段名称和值的列表,用于格式化 Redis 的
HSET
(或
HMSET
)命令。 转换规则如
SELECT map_to_redis_hset_args(payload.value) as hset_fields FROM t/1
, 这样可以准备好
hset_fields
变量,以便集成到 Redis 动作命令模板中,格式为
HMSET name1 ${hset_fields}
。 例如,如果
payload.value
是映射
{"a" : 1, "b": 2}
,则生成的命令可能为
HMSET name1 b 2 a 1
。 请注意,映射中的字段顺序是不确定的。
map_to_entries(Map: map) -> array
将 Map 转换为包含
key
,
value
字段的对象数组。示例:
map_values(Map: map) -> array
返回 Map 中所有的 Value。示例:
mget(Key: string | array, Map: map) -> any
返回 Map 中指定 Key 的值,如果该 Key 在 Map 中不存在,则返回 undefined。可以使用数组一次指定多个 Key 以便从嵌套的 Map 中获取关联的值。示例:
mput(Key: string | array, Value: any, Map: map) -> map
将 Key 与关联的 Value 插入到 Map 中,返回更新后的 Map。如果原始 Map 中该 Key 已经存在,那么旧的关联值将被替换为新的 Value。可以使用数组一次指定多个 Key 以便向嵌套的 Map 插入数据。示例:
数组操作函数
contains(Item: any, Array: array) -> boolean
判断数组 Array 是否包含指定的 Item。示例:
first(Array: array) -> any
返回数组 Array 中的第一个元素。Array 不可为空。示例:
last(Array: array) -> any
返回数组 Array 中的最后一个元素。Array 不可为空。示例:
length(Array: array) -> integer
返回数组 Array 的长度,即 Array 中元素的个数。示例:
nth(N: integer, Array: array) -> any
返回数组 Array 中的第 N 个元素。N 不应大于 Array 长度。示例:
sublist(Length: integer, Array: array) -> any
返回从数组 Array 中第 1 个元素开始,最大长度为 Length 的子数组。如果 Length 大于 Array 长度,将返回整个数组。示例:
sublist(Start: integer, Length: integer, Array:array) -> any
同
sublist/2
,但可以使用 Start 指定从第几个元素开始返回。如果 Start + Length 大于 Array 长度,那么将返回整个数组。示例:
哈希函数
md5(String: string) -> string
为任意长度字符串 String 计算长度固定为 128 位的 MD5 散列值。该散列值将以 32 个十六进制数字组成的文本形式返回。返回字符串中的字母固定为小写形式(a ~ f)。
示例:
sha(String: string) -> string
使用 SHA-1 算法为任意长度字符串 String 计算长度固定为 160 位的 SHA 散列值。该散列值将以 40 个十六进制数字组成的文本形式返回。返回字符串中的字母固定为小写形式(a ~ f)。
示例:
sha256(String: string) -> string
使用 SHA-2 算法为任意长度字符串 String 计算长度固定为 256 位的 SHA 散列值。该散列值将以 64 个十六进制数字组成的文本形式返回。返回字符串中的字母固定为小写形式(a ~ f)。
示例:
压缩与解压缩函数
注意:二进制数据无法直接进行 JSON 编码,必须调用 bin2hexstr 函数将其转换成对应的由十六进制数字组成的字符串。
gunzip(Data: binary) -> binary | string
解压 Data,Data 必须包含 gz 头部和位于尾部的校验和 。示例:
gzip(Data: binary | string) -> binary
使用 DEFLATE 算法压缩 Data,返回的压缩结果中 包含 gz 头部和位于尾部的校验和 。示例:
unzip(Data: binary) -> binary | string
解压 Data,Data 中 不应包含 zlib 头部和位于尾部的校验和 。示例:
zip(Data: binary | string) -> binary
使用 DEFLATE 算法压缩 Data,返回的压缩结果中 不包含 zlib 头部和位于尾部的校验和 。示例:
zip_compress(Data: binary | string) -> binary
使用 DEFLATE 算法压缩 Data,返回的压缩结果中 包含 zlib 头部和位于尾部的验和 。示例:
zip_uncompress(Data: binary) -> binary | string
解压 Data,Data 必须包含 zlib 头部和位于尾部的校验和 。示例:
比特位操作函数
bitand(Num1: integer, Num2: integer) -> integer
返回 Num1 和 Num2 的 按位与 结果,输入输出均为有符号整型。示例:
bitnot(Num: integer) -> integer
返回 Num 的 按位取反 结果,输入输出均为有符号整型。示例:
bitsl(Num: integer, Shift: integer) -> integer
将 Num 按位左移 Shift 位,右侧空白由 0 填充。示例:
bitsr(Num: integer, Shift: integer) -> integer
将 Num 按位右移 Shift 位,左侧空白填充符号位(即正数补 0,负数补 1)。示例:
bitor(Num1: integer, Num2: integer) -> integer
返回 Num1 和 Num2 的 按位或 结果。示例:
bitxor(Num1: integer, Num2: integer) -> integer
返回 Num1 和 Num2 的 按位异或 结果。示例:
位序列操作函数
规则引擎提供了一些用于操作位序列的函数。例如 subbits 用于提取位序列并将其转换为指定的数据类型。
TIP
binary 类型表示一个字节序列,每个字节由 8 个比特位组成,所以任意一个 binary 中的比特位一定是 8 的整数倍。bitstring 类型表示一个位序列,它可以由任意数量的比特位组成。
简单地说,每个 binary 都是 bitstring,但反过来则不一定。
需要注意的是,长度不是 8 的整数倍的 bitstring 不能直接序列化为 JSON 字符串这样的外部格式。它通常作为中间值存在,然后被转换为整数或其他合适的类型使用。
bitsize(Bin: binary) -> integer
返回位序列 Bin 的比特位数。示例:
byteszie(Bin: binary) -> integer
返回字节序列 Bin 的字节数。示例:
subbits(Bin: binary, BitNum: integer) -> integer
从字节序列 Bin 的起始位置开始,获取长度为 BitNum 的比特位,按照大端序列将其转换为无符号整型。等同于
subbits(Bytes, 1, BitNum, 'integer', 'unsigned', 'big')
。
示例:
subbits(Bin: binary, Start: integer, BitNum: integer) -> integer
从字节序列 Bin 的位置 Start 开始(起始位置为 1),获取长度为 BitNum 的比特位,按照大端序列将其转换为无符号整型。等同于
subbits(Bytes, Start, BitNum, 'integer', 'unsigned', 'big')
。
示例:
subbits(Bin: binary, Start: integer, BitNum: integer, OutputType: string, Signedness: string, Endianness: string) -> bitstring | integer | float
从字节序列 Bin 的位置 Start 开始(起始位置为 1),获取长度为 BitNum 的比特位,按照要求的字节顺序 Endianness 和符号性 Signedness 将其转换为 OutputType 类型的数据。
OutputType 的可取值有:
- bits:bitstring 的缩写
- integer
- float
Signedness 的可取值有:
- signed
- unsigned
Endianness 的可取值有:
- big
- little
注意,OutputType 为 float 时,参数 Signedness 不生效,OutputType 为 bits 时,参数 Signedness 和 Endianness 不生效。
示例:
编解码函数
base64_decode(Data: string) -> bytes | string
对 Data 进行 Base64 解码。
base64_encode(Data: binary | string) -> string
对 Data 进行 Base64 编码。示例:
json_decode(Data: string) -> array | map
对 Data 进行 JSON 解码。示例:
json_encode(Data: array | map) -> string
对 Data 进行 JSON 编码。示例:
bin2hexstr(Data: binary) -> string
将二进制数据转换为对应的由十六进制数字组成的字符串。示例:
hexstr2bin(Data: string) -> binary
将由十六进制数字组成的字符串转换为对应的二进制数据。示例:
Schema Registry
在 EMQX 企业版中, schema registry 提供了
schema_decode
和
schema_encode
功能,可以为
Protobuf (Protocol Buffers)
和
Avro
格式的数据进行编解码。 关于功能详情,请见
编解码
。
schema_encode(SchemaID: string, Data: map) -> binary
使用指定的 Avro Schema 对
Data
进行编码。在 Schema Registry 中创建 Schema 以获取 ID。
schema_encode(SchemaID: string, Data: map, MsgType: string) -> binary
使用指定的 Protobuf Schema 对
Data
进行编码。在 Schema Registry 中创建 Schema 以获取 ID。MsgType 用于指定 Data 在 Protobuf Schema 中对应的消息类型。
schema_decode(SchemaID: string, Bin: binary) -> map
使用指定的 Avro Schema 对
Bin
进行解码。在 Schema Registry 中创建 Schema 以获取 ID。
schema_decode(SchemaID: string, Bin: binary, MsgType: string) -> map
使用指定的 Protobuf Schema 对
Bin
进行解码。在 Schema Registry 中创建 Schema 以获取 ID。MsgType 用于指定 Data 在 Protobuf Schema 中对应的消息类型。
Sparkplug B
EMQX 企业版还有专门用于解码和编码 Sparkplug B 消息的特殊用途函数(
sparkplug_decode
和
sparkplug_encode
)。您可以在
Sparkplug B
中了解有关 Sparkplug 函数的更多信息。
日期与时间函数
date_to_unix_ts(Unit: string, FormatString: string, DateTimeString: string) -> integer
按照格式字符串 FormatString 解析日期时间字符串 DateTimeString,将其转换为时间单位为 Unit 的 Unix 时间。
second
,
millisecond
,
microsecond
和
nanosecond
为可以使用的 Unit。
FormatString 中可以使用的占位符如下:
占位符 | 含义 | 取值范围 |
---|---|---|
%Y
|
由四位数字表示的年份 | 0000 - 9999 |
%m
|
由两位数字表示的月份 | 01 - 12 |
%d
|
由两位数字表示的月中的日期 | 01 - 31 |
%H
|
由两位数字表示的小时,采用 24 小时制 | 00 - 24 |
%M
|
由两位数字表示的分钟 | 00 - 59 |
%S
|
由两位数字表示的秒钟 | 00 - 59 |
%N
|
纳秒 | 000000000 - 999999999 |
%6N
|
微秒,即取纳秒的前六位数字 | 000000 - 999999 |
%3N
|
毫秒,即取纳秒的前三位数字 | 000 - 999 |
%z
|
时区偏移量,格式为
±hhmm
|
-1159 - +1159 |
%:z
|
时区偏移量,格式为
±hh:mm
|
-11:59 - +11:59 |
%::z
|
时区偏移量,格式为
±hh:mm:ss
|
-11:59:59 - +11:59:59 |
示例:
date_to_unix_ts(Unit: string, Offset: string | integer, FormatString: string, DateTimeString: string) -> integer
如果 DateTimeString 中未包含时区偏移量,则可以使用 Offset 手动指定该偏移量,其他行为同
date_to_unix_ts/3
。Offset 可以是字符串,也可以是直接以整型表示的秒数。
当 Offset 为字符串时,可以使用以下格式:
-
Z
或z
,表示 UTC 偏移量 00:00。 -
±hh[:mm][:ss]
或±hh[mm][ss]
,相对 UTC 的正负时间偏移量。 -
local
,表示系统本地时区对应的偏移量。
示例:
format_date(Unit: string, Offset: string | integer, FormatString: string, Time: Integer) -> string
将 Unix 时间转换为指定格式的日期时间字符串。Unit 表示待转换 Unix 时间 Time 的时间单位,Offset 表示输出的日期时间中的时区偏移量,FormatString 则表示输出的日期时间格式。
Unit,Offset 和 FormatString 的可取值参见
date_to_unix_ts/3, 4
。
示例:
now_rfc3339() -> string
以 RFC3339 日期时间字符串形式返回当前系统时间,时间单位为秒。示例:
now_rfc3339(Unit: string) -> string
同
now_rfc3339/0
,但可以使用 Unit 指定时间单位,支持
second
,
millisecond
,
microsecond
和
nanosecond
。示例:
now_timestamp() -> integer
以 Unix 时间戳形式返回当前系统时间,时间单位为秒。示例:
now_timestamp(Unit: string) -> integer
同
now_timestamp/0
,但可以使用 Unit 指定时间单位,支持
second
,
millisecond
,
microsecond
和
nanosecond
。示例:
rfc3339_to_unix_ts(DateTimeString: string) -> integer
将符合 RFC3339 标准的日期时间字符串转换为 Unix 时间戳。
2024-02-23T15:56:30Z
就是一个典型的 RFC3339 日期时间字符串,它表示 UTC 时间 2024 年 2 月 23 日,15 点 56 分 30 秒。
示例:
rfc3339_to_unix_ts(DateTimeString: string, Unit: string) -> integer
同
rfc3339_to_unix_ts/1
,但可以使用 Unit 指定返回的 Unix 时间戳单位,支持
second
,
millisecond
,
microsecond
和
nanosecond
。示例:
timezone_to_offset_seconds(Offset: string) -> integer
将字符串形式的时区偏移量转换为以整型表示的秒数。以下是支持的时间偏移量表示形式:
-
Z
或z
,表示 UTC 偏移量 00:00。 -
±hh[:mm][:ss]
或±hh[mm][ss]
,相对 UTC 的正负时间偏移量。 -
local
,表示系统本地时区对应的偏移量。
示例: