日期

Dates 模块提供了两种用于处理日期的类型:DateDateTime,分别表示日和毫秒精度;两者都是抽象 TimeType 的子类型。使用不同类型的动机很简单:在某些操作中,当不必处理更高精度的复杂性时,代码和思维方式都会变得简单得多。例如,由于 Date 类型仅解析到单个日期的精度(即没有小时、分钟或秒),因此无需考虑时区、夏令时和闰秒。

DateDateTime 基本上都是不可变的 Int64 包装器。这两种类型的单个 instant 字段实际上是 UTInstant{P} 类型,它表示基于 UT 秒 [1] 的持续增长的机器时间线。DateTime 类型不知道时区(用 Python 的术语来说是naive),类似于 Java 8 中的LocalDateTime。可以通过 TimeZones.jl 包 添加额外的时区功能,该包编译了 IANA 时区数据库DateDateTime 都基于 ISO 8601 标准,该标准遵循格里历。需要注意的是,ISO 8601 标准对公元前/公元前日期有特殊规定。一般来说,公元前/公元前纪元的最后一天,公元前 1 年 12 月 31 日,紧随其后的是公元 1 年 1 月 1 日,因此不存在零年。然而,ISO 标准规定公元前 1 年是零年,因此 0000-12-310001-01-01 的前一天,年份 -0001(是的,年份为负一)是公元前 2 年,年份 -0002 是公元前 3 年,依此类推。

构造函数

DateDateTime 类型可以通过整数或 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

DateDateTime 解析是通过使用格式字符串来完成的。格式字符串通过定义包含要解析的周期的分隔固定宽度“槽”的概念来工作,并将要解析的文本和格式字符串传递给 DateDateTime 构造函数,格式为 Date("2015-01-01",dateformat"y-m-d")DateTime("20150101",dateformat"yyyymmdd")

分隔槽通过指定解析器在两个后续周期之间应期望的分隔符来标记;因此 "y-m-d" 让解析器知道,在类似 "2014-07-16" 的日期字符串中的第一个和第二个槽之间,它应该找到 - 字符。ymd 字符让解析器知道在每个槽中解析哪个周期。

与上面 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"

还支持通过 uU 字符对文本形式的月份进行解析,分别用于缩写和完整长度的月份名称。默认情况下,仅支持英文月份名称,因此 u 对应于“Jan”、“Feb”、“Mar”等。U 对应于“January”、“February”、“March”等。类似于其他 name=>value 映射函数 daynamemonthname,可以通过将 locale=>Dict{String,Int} 映射分别传递给 MONTHTOVALUEABBRMONTHTOVALUE 字典来加载自定义语言环境,用于缩写和完整名称的月份名称。

以上示例使用了 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 对象。

除了通过构造函数之外,还可以使用 parsetryparse 函数从字符串构造 DateDateTime,但可选的第三个参数的类型为 DateFormat,用于指定格式;例如,parse(Date, "06.23.2013", dateformat"m.d.y")tryparse(DateTime, "1999-12-31T23:59:59") 使用默认格式。这两个函数之间的显着区别在于,使用 tryparse,如果字符串为空或格式无效,则不会抛出错误;而是返回 nothing

Julia 1.9

在 Julia 1.9 之前,可以将空字符串传递给构造函数和 parse 而不会出错,并根据需要返回 DateTime(1)Date(1)Time(0)。同样,tryparse 也不会返回 nothing

stdlib/Dates/test/io.jl 中提供了完整的解析和格式化测试和示例。

持续时间/比较

鉴于 DateDateTime 作为 UTInstant{Day}UTInstant{Millisecond} 的底层表示,查找两个 DateDateTime 之间的时间长度非常简单。 Date 之间的差异以 Day 的数量返回,DateTimeMillisecond 的数量返回。类似地,比较 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

访问器函数

因为 DateDateTime 类型存储为单个 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

daynamemonthname 方法还可以接受一个可选的 locale 关键字,该关键字可用于返回其他语言/区域设置中星期几或一年中月份的名称。这些函数也有返回缩写名称的版本,即 dayabbrmonthabbr。首先,映射加载到 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

接下来的两个高阶方法,tonexttoprev,通过将 DateFunction 作为第一个参数以及起始 TimeType 来概括时间表达式的处理。DateFunction 只是一个函数,通常是匿名的,它以单个 TimeType 作为输入并返回一个 Booltrue 表示满足调整条件。例如

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

舍入

DateDateTime 值可以使用 floorceilround 舍入到指定的精度(例如,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 方法不同,TimeTyperound 方法使用 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 DateDateTime 值是根据 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) 时会发生什么,其中 PPeriod 类型?在某些情况下(特别是当 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机器实例以提供机器瞬间的人类可读表示。TimeDateTimeDateTimeType的子类型。

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字符串

代码示例注释
y6具有固定宽度的数字年份
Y1996具有最小宽度的数字年份
m1, 12具有最小宽度的数字月份
uJan根据locale将月份名称缩短为3个字符
UJanuary根据locale关键字显示完整月份名称
d1, 31具有最小宽度的月份中的日期
H0, 23具有最小宽度的24小时制小时
M0, 59具有最小宽度的分钟
S0, 59具有最小宽度的秒
s000, 500具有最小宽度3的毫秒
eMon, Tue星期几的缩写
EMonday星期的完整名称

连续代码字符的数量指示代码的宽度。格式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字符串

代码匹配注释
Y1996, 96返回1996年,0096年
y1996, 96parse上的Y相同,但在format上丢弃多余的数字
m1, 01匹配1位或2位数字的月份
uJan根据locale关键字匹配月份缩写
UJanuary根据locale关键字匹配完整月份名称
d1, 01匹配1位或2位数字的日期
H00匹配小时(24小时制)
I00用于输出12小时制小时
M00匹配分钟
S00匹配秒
s.500匹配毫秒
eMon, Tues匹配星期几的缩写
EMonday匹配星期几的完整名称
pAM匹配AM/PM(不区分大小写)
yyyymmdd19960101匹配固定宽度的年份、月份和日期

上面未列出的字符通常被视为日期和时间段之间的分隔符。例如,字符串“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说明符解析时间时,任何小时(HI)都被解释为12小时制,因此I代码主要用于输出。

创建DateFormat对象代价很高。尽可能地创建一次并多次使用它,或者尝试dateformat""字符串宏。使用此宏在宏扩展时创建一次DateFormat对象并在以后重复使用它。还有几个预定义的格式化程序,稍后列出。

有关如何分别使用DateFormat对象解析和写入日期字符串,请参阅DateTimeformat

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 转换为 DateDateTime 的小时、分钟、秒和毫秒部分会被截断,因此在构造时仅使用年份、月份和日期部分。

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 转换为 TimeDateTime 的小时、分钟、秒和毫秒部分用于创建新的 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

DateDateTime 的年份,以 Int64 表示。

Dates.month函数
month(dt::TimeType) -> Int64

DateDateTime 的月份,以 Int64 表示。

Dates.week函数
week(dt::TimeType) -> Int64

返回 DateDateTimeISO 周日期,以 Int64 表示。请注意,一年的第一周是包含该年第一个星期四的那一周,这可能导致 1 月 4 日之前的日期位于上一年的最后一周。例如,week(Date(2005, 1, 1)) 是 2004 年的第 53 周。

示例

julia> week(Date(1989, 6, 22))
25

julia> week(Date(2005, 1, 1))
53

julia> week(Date(2004, 12, 31))
53
Dates.day函数
day(dt::TimeType) -> Int64

DateDateTime 的当月日期,以 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.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)

同时返回 DateDateTime 的年份和月份部分。

Dates.monthday函数
monthday(dt::TimeType) -> (Int64, Int64)

同时返回 DateDateTime 的月份和日期部分。

Dates.yearmonthday函数
yearmonthday(dt::TimeType) -> (Int64, Int64, Int64)

同时返回 DateDateTime 的年份、月份和日期部分。

查询函数

Dates.dayname函数
dayname(dt::TimeType; locale="english") -> String
dayname(day::Integer; locale="english") -> String

返回与给定 localeDateDateTime 的星期几对应的完整日期名称。也接受 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

返回与给定 localeDateDateTime 的星期几对应的缩写名称。也接受 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

DateDateTime 的当月日期,以 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

返回给定localeDateDateTimeInteger的月份全称。

示例

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

返回给定localeDateDateTimeInteger的月份缩写。

示例

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,从而调整dtfunc必须接受一个TimeType参数并返回一个Boolsame允许在满足func时考虑dt

Dates.toprev方法
toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType

通过最多迭代limit次,每次迭代增加step,直到func返回true,从而调整dtfunc必须接受一个TimeType参数并返回一个Boolsame允许在满足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

PeriodVector构造一个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}

返回构成给定CompoundPeriodPeriodVector

Julia 1.7

此函数需要 Julia 1.7 或更高版本。

舍入函数

DateDateTime值可以使用floorceilround舍入到指定的精度(例如,1个月或15分钟)。

Base.floor方法
floor(dt::TimeType, p::Period) -> TimeType

返回小于或等于dt且精度为p的最近的DateDateTime

为了方便起见,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的最近的DateDateTime

为了方便起见,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最接近且精度为pDateDateTime。默认情况下(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(默认)、RoundDownfloor)和RoundUpceil)。

大多数Period值也可以舍入到指定的精度

Base.floor方法
floor(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

x向下舍入到precision的最近倍数。如果xprecisionPeriod的不同子类型,则返回值将与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

不支持舍入到precisionMonthYear,因为这些Period的长度不一致。

Base.ceil方法
ceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> T

x向上舍入到precision的最近倍数。如果xprecisionPeriod的不同子类型,则返回值将与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

不支持舍入到precisionMonthYear,因为这些Period的长度不一致。

Base.round方法
round(x::Period, precision::T, [r::RoundingMode]) where T <: Union{TimePeriod, Week, Day} -> T

x舍入到precision的最近倍数。如果xprecisionPeriod的不同子类型,则返回值将与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(默认)、RoundDownfloor)和RoundUpceil)。

不支持舍入到precisionMonthYear,因为这些Period的长度不一致。

以下函数未导出

Dates.floorceil函数
floorceil(dt::TimeType, p::Period) -> (TimeType, TimeType)

同时返回DateDateTime在分辨率p下的floorceil。比分别调用floorceil更高效。

floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)

同时返回Period在分辨率p下的floorceil。比分别调用floorceil更高效。

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

返回从给定的DateDateTime开始,自纪元以来的 Rata Die 日数。

常量

星期几

变量缩写值(整数)
Monday周一1
周二周二2
周三周三3
周四周四4
周五周五5
周六周六6
周日周日7

月份

变量缩写值(整数)
JanuaryJan1
二月二月2
三月三月3
四月四月4
五月五月5
六月六月6
七月七月7
八月八月8
九月九月9
十月十月10
十一月十一月11
十二月十二月12

常用日期格式化器

Dates.ISODateTimeFormat常量
Dates.ISODateTimeFormat

描述日期和时间的 ISO8601 格式。这是DateTimeDates.format的默认值。

示例

julia> Dates.format(DateTime(2018, 8, 8, 12, 0, 43, 1), ISODateTimeFormat)
"2018-08-08T12:00:43.001"
Dates.ISODateFormat常量
Dates.ISODateFormat

描述日期的 ISO8601 格式。这是DateDates.format的默认值。

示例

julia> Dates.format(Date(2018, 8, 8), ISODateFormat)
"2018-08-08"
Dates.ISOTimeFormat常量
Dates.ISOTimeFormat

描述时间的 ISO8601 格式。这是TimeDates.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"
  • 1UT 秒的概念实际上非常重要。通常接受两种不同的时间概念,一种基于地球的物理旋转(一次完整旋转 = 1 天),另一种基于 SI 秒(一个固定、恒定的值)。它们是截然不同的!想想看,一个“UT 秒”,根据地球的旋转定义,其绝对长度可能因天而异!无论如何,DateDateTime基于 UT 秒是一个简化但诚实的假设,这样就可以避免闰秒及其所有复杂性。这种时间基础正式称为UT或 UT1。将类型基于 UT 秒基本上意味着每一分钟有 60 秒,每一天有 24 小时,并且在处理日历日期时可以进行更自然的计算。