日期
Dates
模块提供了两种用于处理日期的类型:Date
和 DateTime
,分别表示日和毫秒精度;两者都是抽象 TimeType
的子类型。使用不同类型的动机很简单:在某些操作中,当不必处理更高精度的复杂性时,代码和思维方式都会变得简单得多。例如,由于 Date
类型仅解析到单个日期的精度(即没有小时、分钟或秒),因此无需考虑时区、夏令时和闰秒。
Date
和 DateTime
基本上都是不可变的 Int64
包装器。这两种类型的单个 instant
字段实际上是 UTInstant{P}
类型,它表示基于 UT 秒 [1] 的持续增长的机器时间线。DateTime
类型不知道时区(用 Python 的术语来说是naive),类似于 Java 8 中的LocalDateTime。可以通过 TimeZones.jl 包 添加额外的时区功能,该包编译了 IANA 时区数据库。Date
和 DateTime
都基于 ISO 8601 标准,该标准遵循格里历。需要注意的是,ISO 8601 标准对公元前/公元前日期有特殊规定。一般来说,公元前/公元前纪元的最后一天,公元前 1 年 12 月 31 日,紧随其后的是公元 1 年 1 月 1 日,因此不存在零年。然而,ISO 标准规定公元前 1 年是零年,因此 0000-12-31
是 0001-01-01
的前一天,年份 -0001
(是的,年份为负一)是公元前 2 年,年份 -0002
是公元前 3 年,依此类推。
构造函数
Date
和 DateTime
类型可以通过整数或 Period
类型、通过解析或通过调整器(稍后详细介绍)来构造。
julia> DateTime(2013)
2013-01-01T00:00:00
julia> DateTime(2013,7)
2013-07-01T00:00:00
julia> DateTime(2013,7,1)
2013-07-01T00:00:00
julia> DateTime(2013,7,1,12)
2013-07-01T12:00:00
julia> DateTime(2013,7,1,12,30)
2013-07-01T12:30: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)
2013-01-01
julia> Date(2013,7)
2013-07-01
julia> Date(2013,7,1)
2013-07-01
julia> Date(Dates.Year(2013),Dates.Month(7),Dates.Day(1))
2013-07-01
julia> Date(Dates.Month(7),Dates.Year(2013))
2013-07-01
Date
或 DateTime
解析是通过使用格式字符串来完成的。格式字符串通过定义包含要解析的周期的分隔或固定宽度“槽”的概念来工作,并将要解析的文本和格式字符串传递给 Date
或 DateTime
构造函数,格式为 Date("2015-01-01",dateformat"y-m-d")
或 DateTime("20150101",dateformat"yyyymmdd")
。
分隔槽通过指定解析器在两个后续周期之间应期望的分隔符来标记;因此 "y-m-d"
让解析器知道,在类似 "2014-07-16"
的日期字符串中的第一个和第二个槽之间,它应该找到 -
字符。y
、m
和 d
字符让解析器知道在每个槽中解析哪个周期。
与上面 Date(2013)
等构造函数一样,分隔 DateFormat
允许日期和时间缺少部分,只要给出前面的部分即可。其他部分将使用通常的默认值。例如,Date("1981-03", dateformat"y-m-d")
返回 1981-03-01
,而 Date("31/12", dateformat"d/m/y")
给出 0001-12-31
。(请注意,默认年份是公元 1 年。)但是,空字符串始终会引发 ArgumentError
。
固定宽度槽通过重复对应于宽度的周期字符来指定,周期字符之间没有分隔符。因此 dateformat"yyyymmdd"
将对应于类似 "20140716"
的日期字符串。解析器通过缺少分隔符来区分固定宽度槽,并注意从一个周期字符到下一个周期字符的转换 "yyyymm"
。
还支持通过 u
和 U
字符对文本形式的月份进行解析,分别用于缩写和完整长度的月份名称。默认情况下,仅支持英文月份名称,因此 u
对应于“Jan”、“Feb”、“Mar”等。U
对应于“January”、“February”、“March”等。类似于其他 name=>value 映射函数 dayname
和 monthname
,可以通过将 locale=>Dict{String,Int}
映射分别传递给 MONTHTOVALUEABBR
和 MONTHTOVALUE
字典来加载自定义语言环境,用于缩写和完整名称的月份名称。
以上示例使用了 dateformat""
字符串宏。此宏在宏展开时创建一次 DateFormat
对象,即使代码片段多次运行,也会使用相同的 DateFormat
对象。
julia> for i = 1:10^5
Date("2015-01-01", dateformat"y-m-d")
end
或者您可以显式创建 DateFormat 对象
julia> df = DateFormat("y-m-d");
julia> dt = Date("2015-01-01",df)
2015-01-01
julia> dt2 = Date("2015-01-02",df)
2015-01-02
或者,使用广播
julia> years = ["2015", "2016"];
julia> Date.(years, DateFormat("yyyy"))
2-element Vector{Date}:
2015-01-01
2016-01-01
为了方便起见,您可以直接传递格式字符串(例如,Date("2015-01-01","y-m-d")
),尽管如果重复解析相同的格式,此表单会产生性能成本,因为它在内部每次都会创建一个新的 DateFormat
对象。
除了通过构造函数之外,还可以使用 parse
和 tryparse
函数从字符串构造 Date
或 DateTime
,但可选的第三个参数的类型为 DateFormat
,用于指定格式;例如,parse(Date, "06.23.2013", dateformat"m.d.y")
或 tryparse(DateTime, "1999-12-31T23:59:59")
使用默认格式。这两个函数之间的显着区别在于,使用 tryparse
,如果字符串为空或格式无效,则不会抛出错误;而是返回 nothing
。
在 Julia 1.9 之前,可以将空字符串传递给构造函数和 parse
而不会出错,并根据需要返回 DateTime(1)
、Date(1)
或 Time(0)
。同样,tryparse
也不会返回 nothing
。
在 stdlib/Dates/test/io.jl
中提供了完整的解析和格式化测试和示例。
持续时间/比较
鉴于 Date
或 DateTime
作为 UTInstant{Day}
和 UTInstant{Millisecond}
的底层表示,查找两个 Date
或 DateTime
之间的时间长度非常简单。 Date
之间的差异以 Day
的数量返回,DateTime
以 Millisecond
的数量返回。类似地,比较 TimeType
只是简单地比较底层机器时刻(这反过来又比较内部 Int64
值)。
julia> dt = Date(2012,2,29)
2012-02-29
julia> dt2 = Date(2000,2,1)
2000-02-01
julia> dump(dt)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 734562
julia> dump(dt2)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 730151
julia> dt > dt2
true
julia> dt != dt2
true
julia> dt + dt2
ERROR: MethodError: no method matching +(::Date, ::Date)
[...]
julia> dt * dt2
ERROR: MethodError: no method matching *(::Date, ::Date)
[...]
julia> dt / dt2
ERROR: MethodError: no method matching /(::Date, ::Date)
julia> dt - dt2
4411 days
julia> dt2 - dt
-4411 days
julia> dt = DateTime(2012,2,29)
2012-02-29T00:00:00
julia> dt2 = DateTime(2000,2,1)
2000-02-01T00:00:00
julia> dt - dt2
381110400000 milliseconds
访问器函数
因为 Date
和 DateTime
类型存储为单个 Int64
值,所以可以通过访问器函数检索日期部分或字段。小写访问器将字段作为整数返回
julia> t = Date(2014, 1, 31)
2014-01-31
julia> Dates.year(t)
2014
julia> Dates.month(t)
1
julia> Dates.week(t)
5
julia> Dates.day(t)
31
当 propercase 在相应的 Period
类型中返回相同的值时
julia> Dates.Year(t)
2014 years
julia> Dates.Day(t)
31 days
提供复合方法是因为同时访问多个字段比单独访问更有效率
julia> Dates.yearmonth(t)
(2014, 1)
julia> Dates.monthday(t)
(1, 31)
julia> Dates.yearmonthday(t)
(2014, 1, 31)
也可以访问底层的 UTInstant
或整数值
julia> dump(t)
Date
instant: Dates.UTInstant{Day}
periods: Day
value: Int64 735264
julia> t.instant
Dates.UTInstant{Day}(Day(735264))
julia> Dates.value(t)
735264
查询函数
查询函数提供关于 TimeType
的日历信息。它们包括有关星期几的信息
julia> t = Date(2014, 1, 31)
2014-01-31
julia> Dates.dayofweek(t)
5
julia> Dates.dayname(t)
"Friday"
julia> Dates.dayofweekofmonth(t) # 5th Friday of January
5
一年中的月份
julia> Dates.monthname(t)
"January"
julia> Dates.daysinmonth(t)
31
以及有关 TimeType
的年份和季度的信息
julia> Dates.isleapyear(t)
false
julia> Dates.dayofyear(t)
31
julia> Dates.quarterofyear(t)
1
julia> Dates.dayofquarter(t)
31
dayname
和 monthname
方法还可以接受一个可选的 locale
关键字,该关键字可用于返回其他语言/区域设置中星期几或一年中月份的名称。这些函数也有返回缩写名称的版本,即 dayabbr
和 monthabbr
。首先,映射加载到 LOCALES
变量中
julia> french_months = ["janvier", "février", "mars", "avril", "mai", "juin",
"juillet", "août", "septembre", "octobre", "novembre", "décembre"];
julia> french_monts_abbrev = ["janv","févr","mars","avril","mai","juin",
"juil","août","sept","oct","nov","déc"];
julia> french_days = ["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"];
julia> Dates.LOCALES["french"] = Dates.DateLocale(french_months, french_monts_abbrev, french_days, [""]);
然后可以使用上述函数执行查询
julia> Dates.dayname(t;locale="french")
"vendredi"
julia> Dates.monthname(t;locale="french")
"janvier"
julia> Dates.monthabbr(t;locale="french")
"janv"
由于没有加载星期的缩写版本,因此尝试使用函数 dayabbr
将会抛出错误。
julia> Dates.dayabbr(t;locale="french")
ERROR: BoundsError: attempt to access 1-element Vector{String} at index [5]
Stacktrace:
[...]
TimeType-Period 算术
在使用任何语言/日期框架时,熟悉日期-周期算术的处理方式是一个好习惯,因为有一些 棘手的问题 需要处理(尽管对于日精度类型来说要少得多)。
Dates
模块方法试图遵循一个简单的原则,即在进行 Period
算术运算时尽可能少地改变。这种方法通常也被称为日历算术或你在谈话中被问到同样的计算时可能会猜到的结果。为什么对此大惊小怪呢?让我们举一个经典的例子:将 1 个月添加到 2014 年 1 月 31 日。答案是什么?Javascript 会说 3 月 3 日(假设 31 天)。PHP 说 3 月 2 日(假设 30 天)。事实上,没有正确的答案。在 Dates
模块中,它给出了 2 月 28 日的结果。它是如何计算出来的?考虑一下赌场中经典的 7-7-7 赌博游戏。
现在想象一下,而不是 7-7-7,插槽是年-月-日,或者在我们的例子中,2014-01-31。当你要求将 1 个月添加到此日期时,月份槽会递增,所以现在我们有 2014-02-31。然后检查日期数字是否大于新月份的最后一个有效日期;如果是(如上例所示),则将日期数字调整到最后一个有效日期(28)。这种方法有什么影响?继续将另一个月添加到我们的日期,2014-02-28 + Month(1) == 2014-03-28
。什么?你期待 3 月的最后一天吗?不,对不起,请记住 7-7-7 插槽。尽可能少的插槽会发生变化,所以我们首先将月份槽递增 1,2014-03-28,然后我们就完成了,因为这是一个有效的日期。另一方面,如果我们要将 2 个月添加到我们的原始日期 2014-01-31,那么我们将得到 2014-03-31,如预期的那样。这种方法的另一个影响是,当强制特定的顺序时,关联性会丢失(即以不同的顺序添加内容会导致不同的结果)。例如
julia> (Date(2014,1,29)+Dates.Day(1)) + Dates.Month(1)
2014-02-28
julia> (Date(2014,1,29)+Dates.Month(1)) + Dates.Day(1)
2014-03-01
那里发生了什么?在第一行中,我们将 1 天添加到 1 月 29 日,结果是 2014-01-30;然后我们添加 1 个月,所以我们得到 2014-02-30,然后调整到 2014-02-28。在第二个例子中,我们首先添加 1 个月,我们得到 2014-02-29,调整到 2014-02-28,然后再添加 1 天,结果是 2014-03-01。在这种情况下,一个有助于解决问题的设计原则是,在存在多个周期的情况下,操作将按周期的类型排序,而不是按其值或位置顺序排序;这意味着Year
将始终首先添加,然后是 Month
,然后是 Week
等。因此,以下确实导致了关联性和正常工作
julia> Date(2014,1,29) + Dates.Day(1) + Dates.Month(1)
2014-03-01
julia> Date(2014,1,29) + Dates.Month(1) + Dates.Day(1)
2014-03-01
棘手吗?也许。一个天真的 Dates
用户该怎么办?底线是要意识到,在处理月份时,明确地强制特定的关联性可能会导致一些意想不到的结果,但除此之外,一切都应该按预期工作。值得庆幸的是,这几乎是在处理 UT 中的时间时,日期-周期算术中奇特情况的全部范围(避免处理夏令时、闰秒等“乐趣”)。
作为奖励,所有周期算术对象都直接与范围一起工作
julia> dr = Date(2014,1,29):Day(1):Date(2014,2,3)
Date("2014-01-29"):Day(1):Date("2014-02-03")
julia> collect(dr)
6-element Vector{Date}:
2014-01-29
2014-01-30
2014-01-31
2014-02-01
2014-02-02
2014-02-03
julia> dr = Date(2014,1,29):Dates.Month(1):Date(2014,07,29)
Date("2014-01-29"):Month(1):Date("2014-07-29")
julia> collect(dr)
7-element Vector{Date}:
2014-01-29
2014-02-28
2014-03-29
2014-04-29
2014-05-29
2014-06-29
2014-07-29
调整器函数
日期-周期算术虽然很方便,但通常对日期进行的计算具有日历或时间性质,而不是固定的周期数。假期就是一个完美的例子;大多数都遵循诸如“阵亡将士纪念日 = 5 月的最后一个星期一”或“感恩节 = 11 月的第四个星期四”之类的规则。这些时间表达式处理相对于日历的规则,例如一个月的第一天或最后一天、下一个星期二或第一个和第三个星期三等。
Dates
模块通过几个方便的方法提供调整器 API,这些方法有助于简单而简洁地表达时间规则。第一组调整器方法处理星期、月、季度和年的第一天和最后一天。它们都以单个 TimeType
作为输入,并返回或调整到相对于输入的所需周期的第一天或最后一天。
julia> Dates.firstdayofweek(Date(2014,7,16)) # Adjusts the input to the Monday of the input's week
2014-07-14
julia> Dates.lastdayofmonth(Date(2014,7,16)) # Adjusts to the last day of the input's month
2014-07-31
julia> Dates.lastdayofquarter(Date(2014,7,16)) # Adjusts to the last day of the input's quarter
2014-09-30
接下来的两个高阶方法,tonext
和 toprev
,通过将 DateFunction
作为第一个参数以及起始 TimeType
来概括时间表达式的处理。DateFunction
只是一个函数,通常是匿名的,它以单个 TimeType
作为输入并返回一个 Bool
,true
表示满足调整条件。例如
julia> istuesday = x->Dates.dayofweek(x) == Dates.Tuesday; # Returns true if the day of the week of x is Tuesday
julia> Dates.tonext(istuesday, Date(2014,7,13)) # 2014-07-13 is a Sunday
2014-07-15
julia> Dates.tonext(Date(2014,7,13), Dates.Tuesday) # Convenience method provided for day of the week adjustments
2014-07-15
这对于使用 do 块语法进行更复杂的时间表达式很有用
julia> Dates.tonext(Date(2014,7,13)) do x
# Return true on the 4th Thursday of November (Thanksgiving)
Dates.dayofweek(x) == Dates.Thursday &&
Dates.dayofweekofmonth(x) == 4 &&
Dates.month(x) == Dates.November
end
2014-11-27
Base.filter
方法可用于获取指定范围内的所有有效日期/时刻
# Pittsburgh street cleaning; Every 2nd Tuesday from April to November
# Date range from January 1st, 2014 to January 1st, 2015
julia> dr = Dates.Date(2014):Day(1):Dates.Date(2015);
julia> filter(dr) do x
Dates.dayofweek(x) == Dates.Tue &&
Dates.April <= Dates.month(x) <= Dates.Nov &&
Dates.dayofweekofmonth(x) == 2
end
8-element Vector{Date}:
2014-04-08
2014-05-13
2014-06-10
2014-07-08
2014-08-12
2014-09-09
2014-10-14
2014-11-11
其他示例和测试可在 stdlib/Dates/test/adjusters.jl
中找到。
周期类型
周期是对时间离散、有时不规则持续时间的人为视角。考虑 1 个月;它可以表示,以天为单位,值可以是 28、29、30 或 31,具体取决于年份和月份的上下文。或者一年可以表示 365 天或 366 天,如果是闰年。Period
类型是简单的 Int64
包装器,并且通过包装任何 Int64
可转换类型来构造,即 Year(1)
或 Month(3.0)
。相同类型 Period
之间的算术运算类似于整数,并且提供了有限的 Period-Real
算术运算。可以使用 Dates.value
提取底层整数。
julia> y1 = Dates.Year(1)
1 year
julia> y2 = Dates.Year(2)
2 years
julia> y3 = Dates.Year(10)
10 years
julia> y1 + y2
3 years
julia> div(y3,y2)
5
julia> y3 - y2
8 years
julia> y3 % y2
0 years
julia> div(y3,3) # mirrors integer division
3 years
julia> Dates.value(Dates.Millisecond(10))
10
可以使用 Dates.CompoundPeriod
类型来表示不是基本类型的整数倍的周期或持续时间。复合周期可以从简单的 Period
类型手动构造。此外,可以使用 canonicalize
函数将周期分解成 Dates.CompoundPeriod
。这对于将持续时间(例如两个 DateTime
的差值)转换为更方便的表示形式特别有用。
julia> cp = Dates.CompoundPeriod(Day(1),Minute(1))
1 day, 1 minute
julia> t1 = DateTime(2018,8,8,16,58,00)
2018-08-08T16:58:00
julia> t2 = DateTime(2021,6,23,10,00,00)
2021-06-23T10:00:00
julia> canonicalize(t2-t1) # creates a CompoundPeriod
149 weeks, 6 days, 17 hours, 2 minutes
舍入
Date
和 DateTime
值可以使用 floor
、ceil
或 round
舍入到指定的精度(例如,1 个月或 15 分钟)
julia> floor(Date(1985, 8, 16), Dates.Month)
1985-08-01
julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Dates.Minute(15))
2013-02-13T00:45:00
julia> round(DateTime(2016, 8, 6, 20, 15), Dates.Day)
2016-08-07T00:00:00
与默认情况下将关系断开到偶数的数值 round
方法不同,TimeType
round
方法使用 RoundNearestTiesUp
舍入模式。(很难猜测将关系断开到最近的“偶数”TimeType
会带来什么。)有关可用 RoundingMode
的更多详细信息,请参阅 API 参考。
舍入通常应该按预期工作,但有一些情况下的预期行为并不明显。
舍入纪元
在许多情况下,为舍入指定的精度(例如,Dates.Second(30)
)可以被均匀地划分为下一个较大的周期(在本例中为 Dates.Minute(1)
)。但是,在这种情况下不为真的舍入行为可能会导致混淆。将 DateTime
舍入到最接近的 10 小时的预期结果是什么?
julia> round(DateTime(2016, 7, 17, 11, 55), Dates.Hour(10))
2016-07-17T12:00:00
鉴于小时(12)不能被 10 整除,这可能看起来令人困惑。选择 2016-07-17T12:00:00
的原因是它是在 0000-01-01T00:00:00
之后 17,676,660 小时,并且 17,676,660 可以被 10 整除。
由于 Julia Date
和 DateTime
值是根据 ISO 8601 标准表示的,因此选择 0000-01-01T00:00:00
作为基准(或“舍入纪元”),从该基准开始计算舍入计算中使用的日期(和毫秒)。(请注意,这与 Julia 使用 Rata Die 表示法 内部表示 Date
略有不同;但由于 ISO 8601 标准对最终用户最可见,因此选择 0000-01-01T00:00:00
作为舍入纪元而不是内部使用的 0000-12-31T00:00:00
以最大程度地减少混淆。)
使用 0000-01-01T00:00:00
作为舍入纪元的唯一例外是舍入到星期时。舍入到最接近的星期将始终返回星期一(ISO 8601 指定的星期第一天)。出于这个原因,当舍入到一定数量的星期时,我们使用 0000-01-03T00:00:00
(根据 ISO 8601 定义的 0000 年第一周的第一天)作为基准。
这是一个预期行为不一定明显的相关案例:当我们舍入到最接近的 P(2)
时会发生什么,其中 P
是 Period
类型?在某些情况下(特别是当 P <: Dates.TimePeriod
时),答案很明确
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Hour(2))
2016-07-17T08:00:00
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Minute(2))
2016-07-17T08:56:00
这似乎很明显,因为这些周期中的两个仍然可以均匀地划分为下一个较大的周期。但在两个月的情况下(仍然可以均匀地划分为一年),答案可能会令人惊讶
julia> round(DateTime(2016, 7, 17, 8, 55, 30), Dates.Month(2))
2016-07-01T00:00:00
为什么舍入到 7 月的第一天,即使它是 7 月(奇数)?关键是月份是从 1 开始索引的(第一个月分配为 1),这与小时、分钟、秒和毫秒不同(其中第一个分配为 0)。
这意味着将DateTime
四舍五入到秒、分、小时或年(因为ISO 8601规范包括年份零)的偶数倍,将导致该字段中DateTime
具有偶数值,而将DateTime
四舍五入到月份的偶数倍将导致月份字段具有奇数值。由于月份和年份可能包含不规则的天数,因此将四舍五入到偶数天数是否会导致天数字段中出现偶数值尚不确定。
有关从Dates
模块导出的方法的更多信息,请参阅API参考。
API参考
日期和时间类型
Dates.Period
— 类型Period
Year
Quarter
Month
Week
Day
Hour
Minute
Second
Millisecond
Microsecond
Nanosecond
Period
类型表示时间的离散、人类可读的表示。
Dates.CompoundPeriod
— 类型CompoundPeriod
CompoundPeriod
对于表达不是较小周期固定倍数的时间周期很有用。例如,“一年零一天”不是固定天数,但可以使用CompoundPeriod
来表达。实际上,CompoundPeriod
是通过不同周期类型的加法自动生成的,例如Year(1) + Day(1)
会生成CompoundPeriod
结果。
Dates.Instant
— 类型Instant
Instant
类型表示基于整数的、机器可读的时间表示,作为从纪元开始的连续时间线。
Dates.UTInstant
— 类型UTInstant{T}
UTInstant
表示基于UT时间的机器时间线(1天=地球自转一周)。T
是一个Period
参数,指示瞬间的分辨率或精度。
Dates.TimeType
— 类型TimeType
TimeType
类型包装Instant
机器实例以提供机器瞬间的人类可读表示。Time
、DateTime
和Date
是TimeType
的子类型。
Dates.DateTime
— 类型DateTime
DateTime
包装一个UTInstant{Millisecond}
并根据格里高利历进行解释。
Dates.Date
— 类型Date
Date
包装一个UTInstant{Day}
并根据格里高利历进行解释。
Dates.Time
— 类型Time
Time
包装一个Nanosecond
并表示24小时制中的特定时刻。
Dates.TimeZone
— 类型TimeZone
地理区域通常基于经度确定特定位置的时间。一些时区实行夏令时(例如EST -> EDT)。有关实现和更多支持,请参阅TimeZones.jl
包
Dates.UTC
— 类型UTC
UTC
,或协调世界时,是所有其他时区测量的TimeZone
。它与0°经线上的时间相关联。它不会因夏令时而调整。
日期函数
Dates.DateTime
— 方法DateTime(y, [m, d, h, mi, s, ms]) -> DateTime
按部分构造DateTime
类型。参数必须可转换为Int64
。
Dates.DateTime
— 方法DateTime(periods::Period...) -> DateTime
通过Period
类型部分构造DateTime
类型。参数可以按任何顺序排列。未提供的DateTime部分将默认为Dates.default(period)
的值。
Dates.DateTime
— 方法DateTime(f::Function, y[, m, d, h, mi, s]; step=Day(1), limit=10000) -> DateTime
通过调整器API创建DateTime
。起点将根据提供的y, m, d...
参数构建,并将进行调整,直到f::Function
返回true
。调整中的步长可以通过step
关键字手动提供。limit
为调整API在抛出错误之前(如果f::Function
从未满足)将追求的最大迭代次数提供了一个限制。
示例
julia> DateTime(dt -> second(dt) == 40, 2010, 10, 20, 10; step = Second(1))
2010-10-20T10:00:40
julia> DateTime(dt -> hour(dt) == 20, 2010, 10, 20, 10; step = Hour(1), limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
Dates.DateTime
— 方法DateTime(dt::Date) -> DateTime
将Date
转换为DateTime
。新DateTime
的小时、分钟、秒和毫秒部分假定为零。
Dates.DateTime
— 方法DateTime(dt::AbstractString, format::AbstractString; locale="english") -> DateTime
通过解析遵循format
字符串中给定模式的dt
日期时间字符串来构造DateTime
(有关语法,请参阅DateFormat
)。
此方法每次调用时都会创建一个DateFormat
对象。建议您改为创建一个DateFormat
对象并将其用作第二个参数,以避免在重复使用相同格式时造成性能损失。
示例
julia> DateTime("2020-01-01", "yyyy-mm-dd")
2020-01-01T00:00:00
julia> a = ("2020-01-01", "2020-01-02");
julia> [DateTime(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferred
2-element Vector{DateTime}:
2020-01-01T00:00:00
2020-01-02T00:00:00
Dates.format
— 方法format(dt::TimeType, format::AbstractString; locale="english") -> AbstractString
使用TimeType
对象并应用提供的format
来构造字符串。可以使用以下字符代码来构造format
字符串
代码 | 示例 | 注释 |
---|---|---|
y | 6 | 具有固定宽度的数字年份 |
Y | 1996 | 具有最小宽度的数字年份 |
m | 1, 12 | 具有最小宽度的数字月份 |
u | Jan | 根据locale 将月份名称缩短为3个字符 |
U | January | 根据locale 关键字显示完整月份名称 |
d | 1, 31 | 具有最小宽度的月份中的日期 |
H | 0, 23 | 具有最小宽度的24小时制小时 |
M | 0, 59 | 具有最小宽度的分钟 |
S | 0, 59 | 具有最小宽度的秒 |
s | 000, 500 | 具有最小宽度3的毫秒 |
e | Mon, Tue | 星期几的缩写 |
E | Monday | 星期的完整名称 |
连续代码字符的数量指示代码的宽度。格式yyyy-mm
指定代码y
应具有宽度4,而m
应具有宽度2。生成数字的代码具有关联的模式:固定宽度或最小宽度。固定宽度模式在值短于指定宽度时在左侧用零填充,在值长于指定宽度时截断值。最小宽度模式的工作方式与固定宽度相同,只是它不会截断长于宽度的值。
创建format
时,您可以使用任何非代码字符作为分隔符。例如,要生成字符串“1996-01-15T00:00:00”,您可以使用format
:“yyyy-mm-ddTHH:MM:SS”。请注意,如果您需要将代码字符用作文字,则可以使用转义字符反斜杠。字符串“1996y01m”可以使用格式“yyyy\ymm\m”生成。
Dates.DateFormat
— 类型DateFormat(format::AbstractString, locale="english") -> DateFormat
构造一个日期格式化对象,可用于解析日期字符串或将日期对象格式化为字符串。可以使用以下字符代码来构造format
字符串
代码 | 匹配 | 注释 |
---|---|---|
Y | 1996, 96 | 返回1996年,0096年 |
y | 1996, 96 | 与parse 上的Y 相同,但在format 上丢弃多余的数字 |
m | 1, 01 | 匹配1位或2位数字的月份 |
u | Jan | 根据locale 关键字匹配月份缩写 |
U | January | 根据locale 关键字匹配完整月份名称 |
d | 1, 01 | 匹配1位或2位数字的日期 |
H | 00 | 匹配小时(24小时制) |
I | 00 | 用于输出12小时制小时 |
M | 00 | 匹配分钟 |
S | 00 | 匹配秒 |
s | .500 | 匹配毫秒 |
e | Mon, Tues | 匹配星期几的缩写 |
E | Monday | 匹配星期几的完整名称 |
p | AM | 匹配AM/PM(不区分大小写) |
yyyymmdd | 19960101 | 匹配固定宽度的年份、月份和日期 |
上面未列出的字符通常被视为日期和时间段之间的分隔符。例如,字符串“1996-01-15T00:00:00.0”的format
字符串将类似于“y-m-dTH:M:S.s”。如果您需要将代码字符用作分隔符,则可以使用反斜杠对其进行转义。日期“1995y01m”的格式将为“y\ym\m”。
请注意,12:00AM对应00:00(午夜),12:00PM对应12:00(中午)。当使用p
说明符解析时间时,任何小时(H
或I
)都被解释为12小时制,因此I
代码主要用于输出。
创建DateFormat对象代价很高。尽可能地创建一次并多次使用它,或者尝试dateformat""
字符串宏。使用此宏在宏扩展时创建一次DateFormat对象并在以后重复使用它。还有几个预定义的格式化程序,稍后列出。
Dates.@dateformat_str
— 宏dateformat"Y-m-d H:M:S"
创建一个DateFormat
对象。类似于DateFormat("Y-m-d H:M:S")
,但在宏扩展期间创建一次DateFormat对象。
有关格式说明符的详细信息,请参阅DateFormat
。
Dates.DateTime
— 方法DateTime(dt::AbstractString, df::DateFormat=ISODateTimeFormat) -> DateTime
通过解析遵循DateFormat
对象中给定模式的dt
日期时间字符串来构造DateTime
,如果省略则使用dateformat"yyyy-mm-dd\THH:MM:SS.s"。
类似于DateTime(::AbstractString, ::AbstractString)
,但在使用预创建的DateFormat
对象重复解析格式相似的日期时间字符串时效率更高。
Dates.Date
— 方法Date(y, [m, d]) -> Date
按部分构造Date
类型。参数必须可转换为Int64
。
Dates.Date
— 方法Date(period::Period...) -> Date
通过Period
类型部分构造Date
类型。参数可以按任何顺序排列。未提供的Date
部分将默认为Dates.default(period)
的值。
Dates.Date
— 方法
Date(f::Function, y[, m, d]; step=Day(1), limit=10000) -> Date
通过调整器 API 创建一个 Date
。起点将根据提供的 y, m, d
参数构建,并将进行调整,直到 f::Function
返回 true
。可以通过 step
关键字手动提供调整的步长。limit
为调整 API 在抛出错误之前(如果 f::Function
始终不满足)将执行的最大迭代次数设置了一个限制。
示例
julia> Date(date -> week(date) == 20, 2010, 01, 01)
2010-05-17
julia> Date(date -> year(date) == 2010, 2000, 01, 01)
2010-01-01
julia> Date(date -> month(date) == 10, 2000, 01, 01; limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
Dates.Date
— 方法Date(dt::DateTime) -> Date
将 DateTime
转换为 Date
。DateTime
的小时、分钟、秒和毫秒部分会被截断,因此在构造时仅使用年份、月份和日期部分。
Dates.Date
— 方法Date(d::AbstractString, format::AbstractString; locale="english") -> Date
通过解析遵循 format
字符串中给定模式的 d
日期字符串来构造 Date
(有关语法,请参阅 DateFormat
)。
此方法每次调用时都会创建一个DateFormat
对象。建议您改为创建一个DateFormat
对象并将其用作第二个参数,以避免在重复使用相同格式时造成性能损失。
示例
julia> Date("2020-01-01", "yyyy-mm-dd")
2020-01-01
julia> a = ("2020-01-01", "2020-01-02");
julia> [Date(d, dateformat"yyyy-mm-dd") for d ∈ a] # preferred
2-element Vector{Date}:
2020-01-01
2020-01-02
Dates.Date
— 方法Date(d::AbstractString, df::DateFormat=ISODateFormat) -> Date
通过解析遵循 DateFormat
对象中给定模式的 d
日期字符串来构造 Date
,如果省略则使用日期格式“yyyy-mm-dd”。
类似于 Date(::AbstractString, ::AbstractString)
,但在使用预先创建的 DateFormat
对象重复解析格式类似的日期字符串时效率更高。
Dates.Time
— 方法Time(h, [mi, s, ms, us, ns]) -> Time
通过分段构造 Time
类型。参数必须可转换为 Int64
。
Dates.Time
— 方法Time(period::TimePeriod...) -> Time
通过 Period
类型部分构造 Time
类型。参数可以按任意顺序排列。未提供的 Time
部分将默认为 Dates.default(period)
的值。
Dates.Time
— 方法Time(f::Function, h, mi=0; step::Period=Second(1), limit::Int=10000)
Time(f::Function, h, mi, s; step::Period=Millisecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms; step::Period=Microsecond(1), limit::Int=10000)
Time(f::Function, h, mi, s, ms, us; step::Period=Nanosecond(1), limit::Int=10000)
通过调整器 API 创建一个 Time
。起点将根据提供的 h, mi, s, ms, us
参数构建,并将进行调整,直到 f::Function
返回 true
。可以通过 step
关键字手动提供调整的步长。limit
为调整 API 在抛出错误之前(如果 f::Function
始终不满足)将执行的最大迭代次数设置了一个限制。请注意,默认步长将调整以允许针对给定参数获得更高的精度;例如,如果提供了小时、分钟和秒参数,则默认步长将为 Millisecond(1)
而不是 Second(1)
。
示例
julia> Time(t -> minute(t) == 30, 20)
20:30:00
julia> Time(t -> minute(t) == 0, 20)
20:00:00
julia> Time(t -> hour(t) == 10, 3; limit = 5)
ERROR: ArgumentError: Adjustment limit reached: 5 iterations
Stacktrace:
[...]
Dates.Time
— 方法Time(dt::DateTime) -> Time
将 DateTime
转换为 Time
。DateTime
的小时、分钟、秒和毫秒部分用于创建新的 Time
。微秒和纳秒默认值为零。
Dates.Time
— 方法Time(t::AbstractString, format::AbstractString; locale="english") -> Time
通过解析遵循 format
字符串中给定模式的 t
时间字符串来构造 Time
(有关语法,请参阅 DateFormat
)。
此方法每次调用时都会创建一个DateFormat
对象。建议您改为创建一个DateFormat
对象并将其用作第二个参数,以避免在重复使用相同格式时造成性能损失。
示例
julia> Time("12:34pm", "HH:MMp")
12:34:00
julia> a = ("12:34pm", "2:34am");
julia> [Time(d, dateformat"HH:MMp") for d ∈ a] # preferred
2-element Vector{Time}:
12:34:00
02:34:00
Dates.Time
— 方法Time(t::AbstractString, df::DateFormat=ISOTimeFormat) -> Time
通过解析遵循 DateFormat
对象中给定模式的 t
日期时间字符串来构造 Time
,如果省略则使用日期格式“HH:MM:SS.s”。
类似于 Time(::AbstractString, ::AbstractString)
,但在使用预先创建的 DateFormat
对象重复解析格式类似的时间字符串时效率更高。
Dates.now
— 方法now() -> DateTime
返回一个对应于用户系统时间的 DateTime
,包括系统时区区域设置。
Dates.now
— 方法now(::Type{UTC}) -> DateTime
返回一个对应于用户系统时间的 DateTime
,以 UTC/GMT 表示。对于其他时区,请参阅 TimeZones.jl 包。
示例
julia> now(UTC)
2023-01-04T10:52:24.864
Base.eps
— 方法eps(::Type{DateTime}) -> Millisecond
eps(::Type{Date}) -> Day
eps(::Type{Time}) -> Nanosecond
eps(::TimeType) -> Period
返回 TimeType
支持的最小单位值。
示例
julia> eps(DateTime)
1 millisecond
julia> eps(Date)
1 day
julia> eps(Time)
1 nanosecond
访问器函数
Dates.year
— 函数year(dt::TimeType) -> Int64
Date
或 DateTime
的年份,以 Int64
表示。
Dates.month
— 函数month(dt::TimeType) -> Int64
Date
或 DateTime
的月份,以 Int64
表示。
Dates.week
— 函数Dates.day
— 函数day(dt::TimeType) -> Int64
Date
或 DateTime
的当月日期,以 Int64
表示。
Dates.hour
— 函数hour(dt::DateTime) -> Int64
DateTime
的当日小时,以 Int64
表示。
hour(t::Time) -> Int64
Time
的小时,以 Int64
表示。
Dates.minute
— 函数minute(dt::DateTime) -> Int64
DateTime
的分钟,以 Int64
表示。
minute(t::Time) -> Int64
Time
的分钟,以 Int64
表示。
Dates.second
— 函数second(dt::DateTime) -> Int64
DateTime
的秒,以 Int64
表示。
second(t::Time) -> Int64
Time
的秒,以 Int64
表示。
Dates.millisecond
— 函数millisecond(dt::DateTime) -> Int64
DateTime
的毫秒,以 Int64
表示。
millisecond(t::Time) -> Int64
Time
的毫秒,以 Int64
表示。
Dates.microsecond
— 函数microsecond(t::Time) -> Int64
Time
的微秒,以 Int64
表示。
Dates.nanosecond
— 函数nanosecond(t::Time) -> Int64
Time
的纳秒,以 Int64
表示。
Dates.Year
— 方法Year(v)
使用给定的 v
值构造 Year
对象。输入必须能够无损转换为 Int64
。
Dates.Month
— 方法Month(v)
使用给定的 v
值构造 Month
对象。输入必须能够无损转换为 Int64
。
Dates.Week
— 方法Week(v)
使用给定的 v
值构造 Week
对象。输入必须能够无损转换为 Int64
。
Dates.Day
— 方法Day(v)
使用给定的 v
值构造 Day
对象。输入必须能够无损转换为 Int64
。
Dates.Hour
— 方法Hour(dt::DateTime) -> Hour
DateTime 的小时部分,以 Hour
表示。
Dates.Minute
— 方法Minute(dt::DateTime) -> Minute
DateTime 的分钟部分,以 Minute
表示。
Dates.Second
— 方法Second(dt::DateTime) -> Second
DateTime 的秒部分,以 Second
表示。
Dates.Millisecond
— 方法Millisecond(dt::DateTime) -> Millisecond
DateTime 的毫秒部分,以 Millisecond
表示。
Dates.Microsecond
— 方法Microsecond(dt::Time) -> Microsecond
Time 的微秒部分,以 Microsecond
表示。
Dates.Nanosecond
— 方法Nanosecond(dt::Time) -> Nanosecond
Time 的纳秒部分,以 Nanosecond
表示。
Dates.yearmonth
— 函数yearmonth(dt::TimeType) -> (Int64, Int64)
同时返回 Date
或 DateTime
的年份和月份部分。
Dates.monthday
— 函数monthday(dt::TimeType) -> (Int64, Int64)
同时返回 Date
或 DateTime
的月份和日期部分。
Dates.yearmonthday
— 函数yearmonthday(dt::TimeType) -> (Int64, Int64, Int64)
同时返回 Date
或 DateTime
的年份、月份和日期部分。
查询函数
Dates.dayname
— 函数dayname(dt::TimeType; locale="english") -> String
dayname(day::Integer; locale="english") -> String
返回与给定 locale
中 Date
或 DateTime
的星期几对应的完整日期名称。也接受 Integer
。
示例
julia> dayname(Date("2000-01-01"))
"Saturday"
julia> dayname(4)
"Thursday"
Dates.dayabbr
— 函数dayabbr(dt::TimeType; locale="english") -> String
dayabbr(day::Integer; locale="english") -> String
返回与给定 locale
中 Date
或 DateTime
的星期几对应的缩写名称。也接受 Integer
。
示例
julia> dayabbr(Date("2000-01-01"))
"Sat"
julia> dayabbr(3)
"Wed"
Dates.dayofweek
— 函数dayofweek(dt::TimeType) -> Int64
返回星期几,以 Int64
表示,其中 1 = 星期一,2 = 星期二,依此类推
。
示例
julia> dayofweek(Date("2000-01-01"))
6
Dates.dayofmonth
— 函数dayofmonth(dt::TimeType) -> Int64
Date
或 DateTime
的当月日期,以 Int64
表示。
Dates.dayofweekofmonth
— 函数dayofweekofmonth(dt::TimeType) -> Int
对于dt
的星期几,返回它在dt
所在月份中的第几个。例如,如果dt
的星期几是星期一,则1 = 当月的第一个星期一,2 = 当月的第二个星期一,依此类推。
范围为1:5。
示例
julia> dayofweekofmonth(Date("2000-02-01"))
1
julia> dayofweekofmonth(Date("2000-02-08"))
2
julia> dayofweekofmonth(Date("2000-02-15"))
3
Dates.daysofweekinmonth
— 函数daysofweekinmonth(dt::TimeType) -> Int
对于dt
的星期几,返回dt
所在月份中该星期几的总天数。返回4或5。在时间表达式中,可以通过在调整函数中包含dayofweekofmonth(dt) == daysofweekinmonth(dt)
来指定一个月中一周的最后一天,这很有用。
示例
julia> daysofweekinmonth(Date("2005-01-01"))
5
julia> daysofweekinmonth(Date("2005-01-04"))
4
Dates.monthname
— 函数monthname(dt::TimeType; locale="english") -> String
monthname(month::Integer, locale="english") -> String
返回给定locale
中Date
、DateTime
或Integer
的月份全称。
示例
julia> monthname(Date("2005-01-04"))
"January"
julia> monthname(2)
"February"
Dates.monthabbr
— 函数monthabbr(dt::TimeType; locale="english") -> String
monthabbr(month::Integer, locale="english") -> String
返回给定locale
中Date
、DateTime
或Integer
的月份缩写。
示例
julia> monthabbr(Date("2005-01-04"))
"Jan"
julia> monthabbr(2)
"Feb"
Dates.daysinmonth
— 函数daysinmonth(dt::TimeType) -> Int
返回dt
所在月份的天数。值为28、29、30或31。
示例
julia> daysinmonth(Date("2000-01"))
31
julia> daysinmonth(Date("2001-02"))
28
julia> daysinmonth(Date("2000-02"))
29
Dates.isleapyear
— 函数isleapyear(dt::TimeType) -> Bool
如果dt
的年份为闰年,则返回true
。
示例
julia> isleapyear(Date("2004"))
true
julia> isleapyear(Date("2005"))
false
Dates.dayofyear
— 函数dayofyear(dt::TimeType) -> Int
返回dt
在一年中的第几天,其中1月1日为第1天。
Dates.daysinyear
— 函数daysinyear(dt::TimeType) -> Int
如果dt
的年份为闰年,则返回366,否则返回365。
示例
julia> daysinyear(1999)
365
julia> daysinyear(2000)
366
Dates.quarterofyear
— 函数quarterofyear(dt::TimeType) -> Int
返回dt
所在的季度。取值范围为1:4。
Dates.dayofquarter
— 函数dayofquarter(dt::TimeType) -> Int
返回dt
所在季度的第几天。取值范围为1:92。
调整函数
Base.trunc
— 方法trunc(dt::TimeType, ::Type{Period}) -> TimeType
根据提供的Period
类型截断dt
的值。
示例
julia> trunc(DateTime("1996-01-01T12:30:00"), Day)
1996-01-01T00:00:00
Dates.firstdayofweek
— 函数firstdayofweek(dt::TimeType) -> TimeType
将dt
调整到其所在周的星期一。
示例
julia> firstdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-01T00:00:00
Dates.lastdayofweek
— 函数lastdayofweek(dt::TimeType) -> TimeType
将dt
调整到其所在周的星期日。
示例
julia> lastdayofweek(DateTime("1996-01-05T12:30:00"))
1996-01-07T00:00:00
Dates.firstdayofmonth
— 函数firstdayofmonth(dt::TimeType) -> TimeType
将dt
调整到其所在月份的第一天。
示例
julia> firstdayofmonth(DateTime("1996-05-20"))
1996-05-01T00:00:00
Dates.lastdayofmonth
— 函数lastdayofmonth(dt::TimeType) -> TimeType
将dt
调整到其所在月份的最后一天。
示例
julia> lastdayofmonth(DateTime("1996-05-20"))
1996-05-31T00:00:00
Dates.firstdayofyear
— 函数firstdayofyear(dt::TimeType) -> TimeType
将dt
调整到其所在年份的第一天。
示例
julia> firstdayofyear(DateTime("1996-05-20"))
1996-01-01T00:00:00
Dates.lastdayofyear
— 函数lastdayofyear(dt::TimeType) -> TimeType
将dt
调整到其所在年份的最后一天。
示例
julia> lastdayofyear(DateTime("1996-05-20"))
1996-12-31T00:00:00
Dates.firstdayofquarter
— 函数firstdayofquarter(dt::TimeType) -> TimeType
将dt
调整到其所在季度的第一天。
示例
julia> firstdayofquarter(DateTime("1996-05-20"))
1996-04-01T00:00:00
julia> firstdayofquarter(DateTime("1996-08-20"))
1996-07-01T00:00:00
Dates.lastdayofquarter
— 函数lastdayofquarter(dt::TimeType) -> TimeType
将dt
调整到其所在季度的最后一天。
示例
julia> lastdayofquarter(DateTime("1996-05-20"))
1996-06-30T00:00:00
julia> lastdayofquarter(DateTime("1996-08-20"))
1996-09-30T00:00:00
Dates.tonext
— 方法tonext(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
将dt
调整到下一个与dow
对应的星期几,其中1 = 星期一,2 = 星期二,依此类推
。设置same=true
允许将当前dt
视为下一个dow
,从而无需进行调整。
Dates.toprev
— 方法toprev(dt::TimeType, dow::Int; same::Bool=false) -> TimeType
将dt
调整到上一个与dow
对应的星期几,其中1 = 星期一,2 = 星期二,依此类推
。设置same=true
允许将当前dt
视为上一个dow
,从而无需进行调整。
Dates.tofirst
— 函数tofirst(dt::TimeType, dow::Int; of=Month) -> TimeType
将dt
调整到其所在月份的第一个dow
。或者,of=Year
将调整到一年的第一个dow
。
Dates.tolast
— 函数tolast(dt::TimeType, dow::Int; of=Month) -> TimeType
将dt
调整到其所在月份的最后一个dow
。或者,of=Year
将调整到一年的最后一个dow
。
Dates.tonext
— 方法tonext(func::Function, dt::TimeType; step=Day(1), limit=10000, same=false) -> TimeType
通过最多迭代limit
次,每次迭代增加step
,直到func
返回true
,从而调整dt
。func
必须接受一个TimeType
参数并返回一个Bool
。same
允许在满足func
时考虑dt
。
Dates.toprev
— 方法toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType
通过最多迭代limit
次,每次迭代增加step
,直到func
返回true
,从而调整dt
。func
必须接受一个TimeType
参数并返回一个Bool
。same
允许在满足func
时考虑dt
。
时间段
Dates.Period
— 方法Year(v)
Quarter(v)
Month(v)
Week(v)
Day(v)
Hour(v)
Minute(v)
Second(v)
Millisecond(v)
Microsecond(v)
Nanosecond(v)
使用给定的v
值构造一个Period
类型。输入必须能够无损转换为Int64
。
Dates.CompoundPeriod
— 方法CompoundPeriod(periods) -> CompoundPeriod
从Period
的Vector
构造一个CompoundPeriod
。相同类型的所有Period
将加在一起。
示例
julia> Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13))
25 hours
julia> Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1))
-1 hour, 1 minute
julia> Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2))
1 month, -2 weeks
julia> Dates.CompoundPeriod(Dates.Minute(50000))
50000 minutes
Dates.canonicalize
— 函数canonicalize(::CompoundPeriod) -> CompoundPeriod
通过应用以下规则将CompoundPeriod
简化为其规范形式
- 任何足够大可以由更粗糙的
Period
部分表示的Period
都将被分解成多个Period
(例如,Hour(30)
变为Day(1) + Hour(6)
) - 符号相反的
Period
将在可能的情况下合并(例如,Hour(1) - Day(1)
变为-Hour(23)
)
示例
julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(12), Dates.Hour(13)))
1 day, 1 hour
julia> canonicalize(Dates.CompoundPeriod(Dates.Hour(-1), Dates.Minute(1)))
-59 minutes
julia> canonicalize(Dates.CompoundPeriod(Dates.Month(1), Dates.Week(-2)))
1 month, -2 weeks
julia> canonicalize(Dates.CompoundPeriod(Dates.Minute(50000)))
4 weeks, 6 days, 17 hours, 20 minutes
Dates.value
— 函数Dates.value(x::Period) -> Int64
对于给定的时间段,返回与该时间段关联的值。例如,value(Millisecond(10))
将10作为整数返回。
Dates.default
— 函数default(p::Period) -> Period
通过对Year、Month和Day返回T(1)
,对Hour、Minute、Second和Millisecond返回T(0)
,为输入Period返回一个合理的“默认”值。
Dates.periods
— 函数Dates.periods(::CompoundPeriod) -> Vector{Period}
返回构成给定CompoundPeriod
的Period
的Vector
。
此函数需要 Julia 1.7 或更高版本。
舍入函数
Date
和DateTime
值可以使用floor
、ceil
或round
舍入到指定的精度(例如,1个月或15分钟)。
Base.floor
— 方法floor(dt::TimeType, p::Period) -> TimeType
返回小于或等于dt
且精度为p
的最近的Date
或DateTime
。
为了方便起见,p
可以是类型而不是值:floor(dt, Dates.Hour)
是floor(dt, Dates.Hour(1))
的简写。
julia> floor(Date(1985, 8, 16), Month)
1985-08-01
julia> floor(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:30:00
julia> floor(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-06T00:00:00
Base.ceil
— 方法ceil(dt::TimeType, p::Period) -> TimeType
返回大于或等于dt
且精度为p
的最近的Date
或DateTime
。
为了方便起见,p
可以是类型而不是值:ceil(dt, Dates.Hour)
是ceil(dt, Dates.Hour(1))
的简写。
julia> ceil(Date(1985, 8, 16), Month)
1985-09-01
julia> ceil(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:45:00
julia> ceil(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-07T00:00:00
Base.round
— 方法round(dt::TimeType, p::Period, [r::RoundingMode]) -> TimeType
返回与dt
最接近且精度为p
的Date
或DateTime
。默认情况下(RoundNearestTiesUp
),舍入(例如,将9:30舍入到最接近的小时)将向上舍入。
为了方便起见,p
可以是类型而不是值:round(dt, Dates.Hour)
是round(dt, Dates.Hour(1))
的简写。
julia> round(Date(1985, 8, 16), Month)
1985-08-01
julia> round(DateTime(2013, 2, 13, 0, 31, 20), Minute(15))
2013-02-13T00:30:00
julia> round(DateTime(2016, 8, 6, 12, 0, 0), Day)
2016-08-07T00:00:00
round(::TimeType, ::Period, ::RoundingMode)
的有效舍入模式为RoundNearestTiesUp
(默认)、RoundDown
(floor
)和RoundUp
(ceil
)。
大多数Period
值也可以舍入到指定的精度
Base.floor
— 方法floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
将x
向下舍入到precision
的最近倍数。如果x
和precision
是Period
的不同子类型,则返回值将与precision
具有相同的类型。
为了方便起见,precision
可以是类型而不是值:floor(x, Dates.Hour)
是floor(x, Dates.Hour(1))
的简写。
julia> floor(Day(16), Week)
2 weeks
julia> floor(Minute(44), Minute(15))
30 minutes
julia> floor(Hour(36), Day)
1 day
不支持舍入到precision
为Month
或Year
,因为这些Period
的长度不一致。
Base.ceil
— 方法ceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T
将x
向上舍入到precision
的最近倍数。如果x
和precision
是Period
的不同子类型,则返回值将与precision
具有相同的类型。
为了方便起见,precision
可以是类型而不是值:ceil(x, Dates.Hour)
是ceil(x, Dates.Hour(1))
的简写。
julia> ceil(Day(16), Week)
3 weeks
julia> ceil(Minute(44), Minute(15))
45 minutes
julia> ceil(Hour(36), Day)
2 days
不支持舍入到precision
为Month
或Year
,因为这些Period
的长度不一致。
Base.round
— 方法round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T
将x
舍入到precision
的最近倍数。如果x
和precision
是Period
的不同子类型,则返回值将与precision
具有相同的类型。默认情况下(RoundNearestTiesUp
),舍入(例如,将90分钟舍入到最接近的小时)将向上舍入。
为了方便起见,precision
可以是类型而不是值:round(x, Dates.Hour)
是round(x, Dates.Hour(1))
的简写。
julia> round(Day(16), Week)
2 weeks
julia> round(Minute(44), Minute(15))
45 minutes
julia> round(Hour(36), Day)
2 days
round(::Period, ::T, ::RoundingMode)
的有效舍入模式为RoundNearestTiesUp
(默认)、RoundDown
(floor
)和RoundUp
(ceil
)。
不支持舍入到precision
为Month
或Year
,因为这些Period
的长度不一致。
以下函数未导出
Dates.floorceil
— 函数floorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)
同时返回Date
或DateTime
在分辨率p
下的floor
和ceil
。比分别调用floor
和ceil
更高效。
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)
同时返回Period
在分辨率p
下的floor
和ceil
。比分别调用floor
和ceil
更高效。
Dates.epochdays2date
— 函数epochdays2date(days) -> Date
获取自舍入纪元(0000-01-01T00:00:00
)以来的天数,并返回相应的Date
。
Dates.epochms2datetime
— 函数epochms2datetime(milliseconds) -> DateTime
获取自舍入纪元(0000-01-01T00:00:00
)以来的毫秒数,并返回相应的DateTime
。
Dates.date2epochdays
— 函数date2epochdays(dt::Date) -> Int64
获取给定的Date
,并返回自舍入纪元(0000-01-01T00:00:00
)以来的天数,以Int64
形式表示。
Dates.datetime2epochms
— 函数datetime2epochms(dt::DateTime) -> Int64
获取给定的DateTime
,并返回自舍入纪元(0000-01-01T00:00:00
)以来的毫秒数,以Int64
形式表示。
转换函数
Dates.today
— 函数today() -> Date
返回now()
的日期部分。
Dates.unix2datetime
— 函数unix2datetime(x) -> DateTime
获取自 Unix 纪元1970-01-01T00:00:00
以来的秒数,并将其转换为相应的DateTime
。
Dates.datetime2unix
— 函数datetime2unix(dt::DateTime) -> Float64
获取给定的DateTime
,并返回自 Unix 纪元1970-01-01T00:00:00
以来的秒数,以Float64
形式表示。
Dates.julian2datetime
— 函数julian2datetime(julian_days) -> DateTime
获取自儒略历纪元-4713-11-24T12:00:00
以来的儒略日数,并返回相应的DateTime
。
Dates.datetime2julian
— 函数datetime2julian(dt::DateTime) -> Float64
获取给定的DateTime
,并返回自儒略历纪元-4713-11-24T12:00:00
以来的儒略日数,以Float64
形式表示。
Dates.rata2datetime
— 函数rata2datetime(days) -> DateTime
获取自纪元0000-12-31T00:00:00
以来的 Rata Die 日数,并返回相应的DateTime
。
Dates.datetime2rata
— 函数datetime2rata(dt::TimeType) -> Int64
返回从给定的Date
或DateTime
开始,自纪元以来的 Rata Die 日数。
常量
星期几
变量 | 缩写 | 值(整数) |
---|---|---|
Monday | 周一 | 1 |
周二 | 周二 | 2 |
周三 | 周三 | 3 |
周四 | 周四 | 4 |
周五 | 周五 | 5 |
周六 | 周六 | 6 |
周日 | 周日 | 7 |
月份
变量 | 缩写 | 值(整数) |
---|---|---|
January | Jan | 1 |
二月 | 二月 | 2 |
三月 | 三月 | 3 |
四月 | 四月 | 4 |
五月 | 五月 | 5 |
六月 | 六月 | 6 |
七月 | 七月 | 7 |
八月 | 八月 | 8 |
九月 | 九月 | 9 |
十月 | 十月 | 10 |
十一月 | 十一月 | 11 |
十二月 | 十二月 | 12 |
常用日期格式化器
Dates.ISODateTimeFormat
— 常量Dates.ISODateTimeFormat
描述日期和时间的 ISO8601 格式。这是DateTime
的Dates.format
的默认值。
示例
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"
Dates.ISODateFormat
— 常量Dates.ISODateFormat
描述日期的 ISO8601 格式。这是Date
的Dates.format
的默认值。
示例
julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"
Dates.ISOTimeFormat
— 常量Dates.ISOTimeFormat
描述时间的 ISO8601 格式。这是Time
的Dates.format
的默认值。
示例
julia> Dates.format(Time(12, 0, 43, 1), ISOTimeFormat)
"12:00:43.001"
Dates.RFC1123Format
— 常量Dates.RFC1123Format
描述日期和时间的 RFC1123 格式。
示例
julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), RFC1123Format)
"Wed, 08 Aug 2018 12:00:43"