现在位置: 首页 > Julia 教程 > 正文

Julia 日期和时间

Julia 通过标准库 Dates 模块提供了以下三个类型来处理日期和时间:

  • Date:表示日期,精确到日,只显示日期。
  • DateTime:表示日期和时间,精确到毫秒。
  • Time:表示日时间,精确到纳秒,代表一天 24 小时中的特定时刻。

使用前,我们需要先导入 Dates 模块:

using Dates

Date 和 DateTime 类型可以通过整数或 Period 类型解析。

Period 基于日期值,表示年、月、日等时间段:

Year        # 年
Quarter     # 季度
Month       # 月
Week        # 周
Day         # 日
Hour        # 小时
Minute      # 分钟
Second      # 秒
Millisecond # 毫秒
Microsecond # 微秒(仅 Time)
Nanosecond  # 纳秒(仅 Time)

Date 和 DateTime 都是抽象类型 TimeType 的子类型。

下图展示了日期类型间的关系,点击图片可以放大查看:


获取当前日期时间

实例

julia> using Dates

# 当前日期时间
julia> rightnow = now()
2022-05-11T08:41:15.917

# 当前日期
julia> today_date = today()
2022-05-11

# UTC 时区的当前时间
julia> now(UTC)
2022-05-11T00:44:20.136

# 现在的时刻(只含时间,不含日期)
julia> Dates.Time(now())
08:41:15.917

# 指定日期创建对象
julia> theday = Date(2022, 5, 6)
2022-05-06

解析与格式化

可以用格式字符串解析日期文本,也可以把日期对象格式化成任意形式的字符串:

实例

# 按格式解析
julia> Dates.DateTime("20220429 120000", "yyyymmdd HHMMSS")
2022-04-29T12:00:00

julia> Dates.DateTime("19/04/2022 17:42", "dd/mm/yyyy HH:MM")
2022-04-19T17:42:00

# 按格式输出
julia> Dates.format(now(), "yyyy-mm-dd HH:MM:SS")
"2022-05-11 09:01:07"

# 内置格式
julia> Dates.format(now(), Dates.RFC1123Format)
"Wed, 11 May 2022 09:15:00"

下表给出了日期格式代码:

字符日期/时间 元素
y表示年,例如: yyyy => 1984, yy => 84
m表示月,例如: m => 7 or 07
u表示月份简写名称,例如: Jun
U表示月份完整名称,例如: January
e表示简写星期几,例如: Mon
E表示完整星期几,例如: Monday
d表示日,例如: 1 or 01
H表示小时,例如: HH => 00
M表示分钟,例如: MM => 00
S表示秒,例如: S => 00
s表示毫秒,例如: .000

实例

julia> Dates.Date("Sun, 27 Sep 2022", "e, d u y")
2022-09-27

julia> Dates.DateTime("Sun, 27 Sep 2022 10:25:10", "e, d u y H:M:S")
2022-09-27T10:25:10

提取日期成分

创建日期时间对象后,可以使用对应的函数获取年、月、日、时、分、秒等成分:

实例

julia> theday = Date(2022, 5, 6)   # 创建日期对象
2022-05-06

julia> year(theday)
2022

julia> month(theday)
5

julia> day(theday)
6

# 当前时间的时、分、秒
julia> rightnow = now()
2022-05-11T08:51:45.342

julia> minute(rightnow)
51

julia> hour(rightnow)
8

julia> second(rightnow)
45

# 星期几(1=周一 ... 7=周日)
julia> dayofweek(theday)
5

# 星期几的英文名
julia> dayname(theday)
"Friday"

# (年, 月, 日) 元组
julia> yearmonthday(theday)
(2022, 5, 6)

# 这个月份的第几个同星期几
julia> dayofweekofmonth(theday)
1

日期运算

我们可以对日期对象进行算术运算。比如我们计算两个日期相差几天:

实例

julia> day1 = Date(2022, 1, 17)
2022-01-17

julia> day2 = Date(2022, 3, 23)
2022-03-23

julia> day2 - day1
65 days

# 用不同单位显示
julia> Dates.canonicalize(Dates.CompoundPeriod(day2 - day1))
9 weeks, 2 days

我们也可以对日期相加,比如计算 2 年 6 个月后的日期:

实例

julia> rightnow = now()
2022-05-11T09:01:07.946

julia> rightnow + Dates.Year(20) + Dates.Month(6)
2042-11-11T09:01:07.946

# 6 天后的日期
julia> rightnow + Dates.Day(6)
2022-05-17T09:01:07.946

日期范围

Julia 可以通过可迭代的 range(区间范围)对象来创建指定区间的日期。在下面给出的示例中,我们创建一个生成每个月第一天的迭代器:

实例

julia> date_range = Date(2011, 1, 1):Dates.Month(1):Date(2022, 1, 1)
Dates.Date("2011-01-01"):Dates.Month(1):Dates.Date("2022-01-01")

在上的区间范围对象中,我们可以用 filter() 找出其中属于工作日的日期:

实例

julia> weekdaysfromrange = filter(dy -> dayname(dy) != "Saturday" && dayname(dy) != "Sunday", date_range)
94-element Vector{Dates.Date}:
 2011-02-01
 2011-03-01
 2011-04-01
 ...

重复日期

我们可以查找一个区间范围内的重复日期,比如每个周日:

实例

julia> filter(d -> dayname(d) == "Sunday", date_range)
20-element Vector{Dates.Date}:
 2011-05-01
 2012-01-01
 ...

四舍五入日期和时间

round()、floor() 和 ceil() 函数也可用于对日期进行四舍五入,以便向前或向后调整日期:

实例

julia> now()
2022-05-11T09:17:49.824

# 舍入到最近的 15 分钟
julia> Dates.format(round(DateTime(now()), Dates.Minute(15)), Dates.RFC1123Format)
"Wed, 11 May 2022 09:15:00"

ceil() 函数将向前调整日期/时间:

实例

julia> theday = Date(2022, 5, 6)
2022-05-06

# 下个月
julia> ceil(theday, Dates.Month)
2022-06-01

# 明年
julia> ceil(theday, Dates.Year)
2023-01-01

# 下周
julia> ceil(theday, Dates.Week)
2022-05-09

Unix 时间

UNIX 时间,或称 POSIX 时间,是 UNIX 或类 UNIX 系统使用的时间表示方式:从 UTC 1970 年 1 月 1 日 0 时 0 分 0 秒起至现在的总秒数,不考虑闰秒。

time() 函数返回 Unix 时间值:

实例

julia> time()
1.652232489777e9

unix2datetime() 函数将 Unix 时间转化为日期/时间对象:

实例

julia> Dates.unix2datetime(time())
2022-05-11T01:28:23.493

内部值

DateTimes 以毫秒为单位存储,我们可以使用 Dates.value 函数获取内部以毫秒计的数值:

实例

julia> moment = now()
2022-05-11T09:31:31.037

julia> Dates.value(moment)
63787944691037

julia> moment.instant
Dates.UTInstant{Millisecond}(Millisecond(63787944691037))

计时

Julia 提供了 @elapsed 宏,它将返回表达式执行所需的时间(秒数):

实例

julia> function foo(n)
           for i in 1:n
               x = sin(rand())
           end
       end
foo (generic function with 1 method)

julia> @elapsed foo(100000000)
1.360567967

julia> @time foo(100000000)
  1.363258 seconds

构造日期的更多实例

实例

julia> DateTime(2013)
2013-01-01T00:00:00

julia> DateTime(2013, 7)
2013-07-01T00:00:00

julia> DateTime(2013, 7, 1, 12, 30, 59)
2013-07-01T12:30:59

julia> DateTime(2013, 7, 1, 12, 30, 59, 1)
2013-07-01T12:30:59.001

julia> Date(2013, 7, 1)
2013-07-01

# 用 Period 类型构造
julia> Date(Dates.Year(2013), Dates.Month(7), Dates.Day(1))
2013-07-01