朱莉娅 - 日期和时间
Julia 有一个名为 Dates 的标准包,它为我们提供了以下两个处理日期和时间的函数 -
- 使用日期 
- 进口日期 
这两个函数之间的区别在于,如果我们使用import Dates函数,那么我们必须在每个函数中显式地添加 Dates 前缀,例如Dates.dayofweek(dt)。另一方面,如果我们使用using Dates函数,那么我们不必在每个函数中显式添加前缀 Dates,因为它将把所有导出的 Dates 函数带入 main 中。
类型之间的关系
Julia 使用各种类型来存储Dates、Times 和 DateTimes。下图显示了这些类型之间的关系 -
 
 
日期、时间和日期时间
为了使用日期和时间,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
