朱莉娅 - 日期和时间


Julia 有一个名为 Dates 的标准包,它为我们提供了以下两个处理日期和时间的函数 -

  • 使用日期

  • 进口日期

这两个函数之间的区别在于,如果我们使用import Dates函数,那么我们必须在每个函数中显式地添加 Dates 前缀,例如Dates.dayofweek(dt)。另一方面,如果我们使用using Dates函数,那么我们不必在每个函数中显式添加前缀 Dates,因为它将把所有导出的 Dates 函数带入 main 中。

类型之间的关系

Julia 使用各种类型来存储Dates、Times 和 DateTimes。下图显示了这些类型之间的关系 -

约会时间

日期和时间1

日期、时间和日期时间

为了使用日期和时间,Julia 具有以下三种数据类型 -

Dates.Time - 精确到纳秒,该对象代表一天中的精确时刻。

Dates.Date - 顾名思义,它只代表一个日期。

Dates.DateTime - 精确到毫秒,该对象表示日期和一天中的时间的组合。它实际上指定了一个确切的时间点。

例子

julia> rightnow = Dates.Time(Dates.now())
15:46:39.872

julia> My_Birthday = Dates.Date(1984,1,17)
1984-01-17

julia> armistice_date = Dates.DateTime(1990,11,11,11,11,11)
1990-11-11T11:11:11

julia> today_date = Dates.today()
2020-09-22

julia> Dates.now(Dates.UTC)
2020-09-22T10:18:32.008

julia> Dates.DateTime("20180629 120000", "yyyymmdd HHMMSS")
2018-06-29T12:00:00

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

重新分级日期和时间的查询

获得日期/时间或日期等对象后,我们可以使用以下函数来提取所需的信息 -

julia> Dates.year(My_Birthday)
1984
julia> Dates.month(My_Birthday)
1
julia> Dates.minute(now())
22
julia> Dates.hour(now())
19
julia> Dates.second(now())
19
julia> Dates.minute(rightnow)
46
julia> Dates.hour(rightnow)
15
julia> Dates.second(rightnow)
39
julia> Dates.dayofweek(My_Birthday)
2
julia> Dates.dayname(My_Birthday)
"Tuesday"
julia> Dates.yearmonthday(My_Birthday)
(1984, 1, 17)
julia> Dates.dayofweekofmonth(My_Birthday)
3

日期算术

还可以对日期/时间以及日期对象进行算术运算。最常见的方法是找到两个此类对象之间的差异,如下例所示 -

例子

julia> today_date - My_Birthday
13409 days

julia> datetimenow - armistice_date
943436237800 milliseconds

我们可以将这些差异转换为某种单位,如下所示 -

julia> Dates.Period(today_date - My_Birthday)
13409 days

julia> Dates.canonicalize(Dates.CompoundPeriod(datetimenow - armistice_date))
1559 weeks, 6 days, 9 hours, 37 minutes, 17 seconds, 800 milliseconds

我们还可以添加和减去日期和日期/时间对象的时间段,如下所示 -

julia> My_Birthday + Dates.Year(20) + Dates.Month(6)
2004-07-17

在上面的例子中,我们在我的出生日期上加上了 20 年零 6 个月。

日期范围

Julia 提供了通过创建可迭代范围对象来创建日期范围的工具。在下面给出的示例中,我们将创建一个生成每月第一天的迭代器。

例子

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

从上面的范围对象中,我们可以找出哪些属于工作日。为此,我们需要为 filter() 创建一个匿名函数,它将根据给定的日期名称测试日期名称 -

julia> weekdaysfromrange = filter(dy -> Dates.dayname(dy) != "Saturday" && Dates.dayname(dy) != "Sunday" , date_range)
171-element Array{Date,1}:
 2000-02-01
 2000-03-01
 2000-05-01
 2000-06-01
 2000-08-01
 2000-09-01
 2000-11-01
 2000-12-01
 2001-01-01
 2001-02-01
 2001-03-01
 2001-05-01
 2001-06-01
 ⋮
 2018-10-01
 2018-11-01
 2019-01-01
 2019-02-01
 2019-03-01
 2019-04-01
 2019-05-01
 2019-07-01
 2019-08-01
 2019-10-01
 2019-11-01
 2020-01-01

日期格式

下表给出了日期格式代码,借助它我们可以指定日期格式 -

特点 日期/时间元素
年份数字 例如 yyyy => 1984, yy => 84
月份数字 例如 米 => 7 或 07
月份名称 例如 君
U 月份名称 例如 一月
e 星期几 周一
星期几 周一
d 日前。1 或 01
H 小时数字 例如 呵呵 => 00
中号 分钟数字 例如 MM => 00
S 第二位数字 例如 小号 => 00
s 毫秒数字 Ex. .000

例子

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

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

舍入日期和时间

我们知道,函数 round()、floor() 和 ceil() 通常用于对数字进行向上或向下舍入。这些函数还可用于对日期进行舍入,以便可以及时向前或向后调整日期。

例子

julia> Dates.now()
2020-09-27T13:34:03.49

julia> Dates.format(round(Dates.DateTime(Dates.now()), Dates.Minute(15)), Dates.RFC1123Format)
"Sun, 27 Sep 2020 13:30:00"

ceil() 函数将向前调整日期/时间,如下所示 -

julia> My_Birthday = Dates.Date(1984,1,17)
1984-01-17

julia> ceil(My_Birthday, Dates.Month)
1984-02-01

julia> ceil(My_Birthday, Dates.Year)
1985-01-01

julia> ceil(My_Birthday, Dates.Week)
1984-01-23

重复日期

如果我们要查找某个日期范围内满足某些条件的所有日期,则称为重复日期。让我们借助以下示例来理解 -

首先,我们需要像之前一样创建一个日期范围 -

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

现在我们可以使用 filter() 函数来查找一个月中的星期日 -

julia> filter(d -> Dates.dayname(d) == "Sunday", date_range)
35-element Array{Date,1}:
 2000-10-01
 2001-04-01
 2001-07-01
 2002-09-01
 2002-12-01
 2003-06-01
 2004-02-01
 2004-08-01
 2005-05-01
 2006-01-01
 2006-10-01
 2007-04-01
 2007-07-01
 ⋮
 2013-12-01
 2014-06-01
 2015-02-01
 2015-03-01
 2015-11-01
 2016-05-01
 2017-01-01
 2017-10-01
 2018-04-01
 2018-07-01
 2019-09-01
 2019-12-01

Unix时间

Unix 时间是另一种计时方式,它计算自 Unix 诞生(1970 年初)以来经过的秒数。我们永远不会观察到 Unix 时间的结束,因为 Julia 将计数存储在 64 位整数中。

time ()函数将返回 Unix 时间值 -

julia> using Dates
julia> time()
1.60206441103e9

unix2datetime ()函数将 Unix 时间值转换为日期/时间对象 -

julia> Dates.unix2datetime(time())
2020-09-10T09:54:52.894

及时的时刻

日期时间在即时字段中以毫秒为单位存储。我们可以使用Dates.value函数获取该值,如下所示 -

julia> moment=Dates.now()
2020-09-10T09:56:11.885

julia> Dates.value(moment)
63737767811885

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

时间和监控

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.113577001

julia> @time foo(100000000)
1.134852 seconds