朱莉娅 - 日期和时间
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