BT编程语言文档
date日期
在BT语言中,date
是一个内置的标准库,用于处理日期和时间。通过该库,你可以轻松地进行时间对象的创建、时间戳的获取、时间格式化的操作以及时间字符串的解析等。
以下是一个详细的教程,帮助你理解和使用date
库。
// 声明一个基于当前时间的时间对象
t = date()
print type(t) // 获取类型,输出:date
// 返回秒级时间戳
print t.secs() // 输出:1728387116
// 返回毫秒级时间戳
print t.millis() // 输出:1728387116794
// 返回微秒级时间戳
print t.micros() // 输出:1728387116794496
// 返回纳秒级时间戳
print t.nanos() // 输出:1728387116794496130
// 返回格式化的时间字符串
print t.format('%Y-%m-%d')
// 通过时间字符串更新时间对象,在BT中,能解析任何形式具有数字的字符串时间
// 常见形式的字符串解析
t.from_str('2024-09-15 06:30:50')
t.from_str('2024-09-15 06:30')
t.from_str('2024-09-15 06')
t.from_str('2024-09-15')
t.from_str('2024-09')
t.from_str('2024')
// 常见形式的字符串解析
t.from_str('2024-09-15 06:30:50')
t.from_str('15-2024-09 06:30:50')
t.from_str('15-09-2024 06:30:50')
t.from_str('50s 15-09-2024 06:30')
t.from_str('2024年09月15日 06时30分50秒')
// 不常见形式的字符串解析
t.from_str('这是年:2024 这是月:09 这是日:15')
// 通过时间戳更新当前时间对象
t.from_timestamp(1728386360)
print t.format('%Y-%m-%d') // 输出:2024-09-10
print t.from_timestamp(1726373550).format('%Y-%m-%d') // 输出:2024-09-15
from_str
函数解析字符串时间时,只解析数字串,然后根据年来定位,先确定年的位置,然后遵循下面规则进行解析,不存在的时间以0处理。
// 字母代表:Y年, m月, d日, h时, i分, s秒
(Y, m, d, h, i, s)
(d, Y, m, h, i, s)
(d, m, Y, h, i, s)
(s, d, m, Y, h, i)
(s, i, d, m, Y, h)
(s, i, h, d, m, Y)
关于format
函数的格式化语法与C语言的strftime
中格式说明符完全一致,以下是一个完整的列表,列出了所有常用的格式说明符:
日期说明符:
-
%Y
2001:完整的公历年份,零填充至4位数字。支持从-262144到262143的年份。注意:公元前1年(BCE)之前或公元9999年(CE)之后的年份,需要加上正负号(+/-)。 -
%C
20:公历年份除以100,零填充至2位数字。 -
%y
01:公历年份对100取模,零填充至2位数字。 -
%m
07:月份数字(01–12),零填充至2位数字。 -
%b
Jul:月份的缩写名称。始终是3个字母。 -
%B
July:月份的完整名称。在解析时也接受相应的缩写。 -
%h
Jul:与%b
相同。 -
%d
08:日期数字(01–31),零填充至2位数字。 -
%e
8:与%d
相同,但使用空格填充。与%_d
相同。 -
%a
Sun:星期几的缩写名称。始终是3个字母。 -
%A
Sunday:星期几的完整名称。在解析时也接受相应的缩写。 -
%w
0:星期天=0,星期一=1,...,星期六=6。 -
%u
7:星期一=1,星期二=2,...,星期天=7。(ISO 8601) -
%U
28:以星期天为一周开始的周数(00–53),零填充至2位数字。 -
%W
27:与%U
相同,但一周的开始是那一年的第一个星期一。 -
%G
2001:与%Y
相同,但使用ISO 8601周日期中的年份。 -
%g
01:与%y
相同,但使用ISO 8601周日期中的年份。 -
%V
27:与%U
相同,但使用ISO 8601周日期中的周数(01–53)。 -
%j
189:一年中的第几天(001–366),零填充至3位数字。 -
%D
07/08/01:月-日-年格式。与%m/%d/%y
相同。 -
%x
07/08/01:本地日期表示(例如,12/31/99)。 -
%F
2001-07-08:年-月-日格式(ISO 8601)。与%Y-%m-%d
相同。 -
%v
8-Jul-2001:日-月-年格式。与%e-%b-%Y
相同。
时间说明符:
-
%H
00:小时数字(00–23),零填充至2位数字。 -
%k
0:与%H
相同,但使用空格填充。与%_H
相同。 -
%I
12:12小时制中的小时数字(01–12),零填充至2位数字。 -
%l
12:与%I
相同,但使用空格填充。与%_I
相同。 -
%P
am:12小时制中的am或pm。 -
%p
AM:12小时制中的AM或PM。 -
%M
34:分钟数字(00–59),零填充至2位数字。 -
%S
60:秒数字(00–60),零填充至2位数字。 -
%f
26490000:自上一整秒起的纳秒数。 -
%.f
.026490:秒的十进制小数部分。消耗前导点。 -
%.3f
.026:固定长度为3的秒的十进制小数部分。 -
%.6f
.026490:固定长度为6的秒的十进制小数部分。 -
%.9f
.026490000:固定长度为9的秒的十进制小数部分。 -
%3f
026:像%.3f
一样,但没有前导点的秒的十进制小数部分。 -
%6f
026490:像%.6f
一样,但没有前导点的秒的十进制小数部分。 -
%9f
026490000:像%.9f
一样,但没有前导点的秒的十进制小数部分。 -
%R
00:34:小时-分钟格式。与%H:%M
相同。 -
%T
00:34:60:小时-分钟-秒格式。与%H:%M:%S
相同。 -
%X
00:34:60:本地时间表示(例如,23:13:48)。 -
%r
12:34:60 AM:本地的12小时制时间表示(例如,11:11:04 PM)。如果本地没有12小时制格式,则回退到%X。
时区说明符:
-
%Z
ACST:本地时区名称。在解析时跳过所有非空白字符。在格式化时与%:z
相同。 -
%z
+0930:从本地时间到UTC的偏移量(UTC为+0000)。 -
%:z
+09:30:与%z
相同,但带有冒号。 -
%::z
+09:30:00:从本地时间到UTC的偏移量,包括秒。 -
%:::z
+09:从本地时间到UTC的偏移量,不包括分钟。 -
%#z
+09:解析专用:与%z
相同,但允许分钟缺失或存在。
日期和时间说明符:
-
%c
Sun Jul 8 00:34:60 2001:本地的日期和时间(例如,Thu Mar 3 23:05:25 2005)。 -
%+
2001-07-08T00:34:60.026490+09:30:ISO 8601/RFC 3339日期和时间格式。 -
%s
994518299:UNIX时间戳,自1970-01-01 00:00 UTC起的秒数。
特殊说明符:
-
%t
:制表符(\t)字面量。 -
%n
:换行符(\n)字面量。 -
%%
:百分号(%)字面量。
修饰符
-
%-?
:抑制任何填充,包括空格和零。(例如,%j = 012,%-j = 12) -
%_?
:使用空格作为填充。(例如,%j = 012,%_j = 12) -
%0?
:使用零作为填充。(例如,%e = 9,%0e = 09)
备注:
-
%C
、%y
:这是向下取整除法,因此公元前100年(年份编号-99)将打印为-1和99。 -
%U
:一周从那一年的第一个星期天开始。可能存在周0,用于表示第一个星期天之前的日期。 -
%G
、%g
、%V
:一周是那一年中至少有4天的第一周。不存在周0,因此应与%G或%g一起使用。 -
%S
:考虑到闰秒,因此60是可能的。 -
%f
、%.f
:%f
和%.f
是显著不同的格式化说明符。%f计算自上一整秒起的纳秒数,而%.f是秒的小数部分。例如,7微秒用%f格式化为7000,用%.f格式化为.000007。 -
%Z
:由于BT的date库只了解时区偏移量而不了解时区本身,因此在使用此格式化说明符时,它只会打印偏移量。时区缩写将不会被打印,从解析的数据中不会填充偏移量,也不会对其进行验证。时区完全被忽略。这与glibc的strptime对此格式代码的处理方式类似。无法可靠地从缩写转换为偏移量,例如CDT既可以表示北美中部夏令时间(Central Daylight Time),也可以表示中国夏令时间(China Daylight Time)。 -
%+
:与%Y-%m-%dT%H:%M:%S%.f%:z
相同,即秒的小数部分有0、3、6或9位数字,时区偏移量中有冒号。此格式还支持用Z或UTC代替%:z
。它们等同于+00:00。请注意,所有T、Z和UTC在解析时都不区分大小写。典型的strftime实现对于此说明符有不同的(且依赖于区域的)格式。虽然BT的date的%+格式更加稳定,但如果您想要控制确切的输出,最好避免使用此说明符。 -
%s
:此说明符不会进行填充,并且可以是负数。对于BT的date库而言,它只考虑非闰秒,因此与ISO C的strftime行为略有不同。