日期
Dates
模組提供兩種用於處理日期的類型:Date
和 DateTime
,分別代表天和毫秒精度;兩者都是抽象 TimeType
的子類型。區分這兩種類型的動機很簡單:某些操作在不必處理較高精度的複雜性時,無論是在程式碼或心智推理方面,都會變得更簡單。例如,由於 Date
類型僅解析為單一日期的精度(即沒有小時、分鐘或秒),因此時區、夏令時間和閏秒的正常考量便不必要且可避免。
Date
和 DateTime
基本上都是不可變的 Int64
包裝器。這兩種類型的單一 instant
欄位實際上是 UTInstant{P}
類型,它表示一個基於 UT 秒的持續增加機器時間軸 [1]。DateTime
類型不認識時區(在 Python 術語中稱為「樸素」),類似於 Java 8 中的 LocalDateTime。可以透過 TimeZones.jl 套件 來新增額外時區功能,該套件會編譯 IANA 時區資料庫。Date
和 DateTime
都是基於 ISO 8601 標準,遵循前儒略曆。請注意,ISO 8601 標準特別注意西元前/公元前日期。一般而言,西元前/公元前時代的最後一天,西元前 1-12-31,接著是西元後 1-1-1,因此沒有西元 0 年。然而,ISO 標準指出西元前 1 年是西元 0 年,因此 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」等。類似於其他名稱=>值對應函式 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
函式,並加上一個型別為 DateFormat
的第三個引數來指定格式,從字串建立 Date
或 DateTime
;例如,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
中找到一組完整的解析和格式化測試和範例。
Durations/Comparisons
找出兩個 Date
或 DateTime
之間的時間長度很簡單,因為它們的底層表示分別為 UTInstant{Day}
和 UTInstant{Millisecond}
。 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
而大寫則會傳回對應 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
算術時,盡量少做變更。這種方法通常也稱為日曆算術,或者如果您在對話中詢問某人相同的計算,您可能會猜到的方法。為什麼對此大驚小怪?讓我們舉一個經典的例子:在 2014 年 1 月 31 日加上 1 個月。答案是什麼?Javascript 會說 3 月 3 日(假設 31 天)。PHP 會說 3 月 2 日(假設 30 天)。事實上,沒有正確的答案。在 Dates
模組中,它會傳回 2 月 28 日的結果。它是如何算出來的?想想賭場中的經典 7-7-7 賭博遊戲。
現在想像一下,如果將時段改為年-月-日,或在我們的範例中為 2014-01-31,而不是 7-7-7。當您要求將 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。在這種情況下,一個有助於設計的原則是,在存在多個期間時,作業將按期間的類型排序,而不是按其值或位置順序排序;這表示年將始終先新增,然後是月,然後是週,依此類推。因此,以下確實會產生關聯性,而且有效
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
調整器函式
日期週期算術雖然方便,但通常在日期上需要的計算類型會採用日曆或時間性質,而不是固定的週期數。假日是一個完美的範例;大多數遵循規則,例如「陣亡將士紀念日 = 五月的最後一個星期一」或「感恩節 = 十一月第四個星期四」。這些類型的時間表達式處理與日曆相關的規則,例如每月的第一天或最後一天、下星期二或第一和第三個星期三等。
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-block 語法處理更複雜的時間表達式很有用
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 日期
和 日期時間
值是根據 ISO 8601 標準表示,因此選擇 0000-01-01T00:00:00
作為基準(或「捨入基準點」),以開始計算捨入計算中使用的天數(和毫秒)。(請注意,這與 Julia 使用 Rata Die 符號 對 日期
的內部表示略有不同;但由於 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
是 期間
類型?在某些情況下(特別是當 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 月 1 日,即使它是 7 月(奇數)?關鍵在於月份是從 1 開始編號(第一個月指定為 1),這與小時、分鐘、秒和毫秒不同(第一個指定為 0)。
這表示將 日期時間
捨入到秒、分鐘、小時或年的偶數倍(因為 ISO 8601 規範包括零年)將導致 日期時間
在該欄位中具有偶數值,而將 日期時間
捨入到月份的偶數倍將導致月份欄位具有奇數值。由於月份和年份都可能包含不規則的天數,因此是否將捨入到偶數天數將導致天數欄位中的偶數值是不確定的。
請參閱 API 參考 以取得更多關於從 Dates
模組匯出的方法的資訊。
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 函數
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 | 一月 | 根據 locale 將月份名稱縮寫為 3 個字元 |
U | 一月 | 根據 locale 關鍵字的完整月份名稱 |
d | 1, 31 | 最小寬度的月份天數 |
H | 0, 23 | 最小寬度的小時(24 小時時鐘) |
M | 0, 59 | 最小寬度的分鐘 |
S | 0, 59 | 最小寬度的秒 |
s | 000, 500 | 最小寬度為 3 的毫秒 |
e | 星期一、星期二 | 星期縮寫 |
E | 星期一 | 星期完整名稱 |
連續代碼字元的數量表示代碼的寬度。yyyy-mm
的格式指定代碼 y
的寬度應為四,而 m
的寬度應為二。產生數字的代碼具有關聯模式:固定寬度或最小寬度。固定寬度模式在值短於指定寬度時,會在值左側補零,而在值較長時會將值截斷。最小寬度模式與固定寬度模式相同,但不會截斷長於寬度的值。
在建立 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 | 一月 | 根據 locale 關鍵字符合縮寫月份 |
U | 一月 | 根據 locale 關鍵字符合完整月份名稱 |
d | 1, 01 | 符合 1 或 2 位數的日期 |
H | 00 | 符合小時(24 小時制) |
I | 00 | 用於輸出 12 小時制的時 |
M | 00 | 符合分鐘 |
S | 00 | 符合秒 |
s | .500 | 符合毫秒 |
e | 週一、週二 | 符合縮寫星期 |
E | 星期一 | 符合星期全名 |
p | 上午 | 符合 AM/PM(不分大小寫) |
yyyymmdd | 19960101 | 符合固定寬度的年、月、日 |
未列於上方的字元通常視為日期和時間區隔之間的分隔符。例如「1996-01-15T00:00:00.0」的 dt
字串將會有類似「y-m-dTH:M:S.s」的 format
字串。如果您需要使用碼字元作為分隔符,可以使用反斜線進行跳脫。日期「1995y01m」將會有「y\ym\m」的格式。
請注意,上午 12:00 對應到 00:00(午夜),下午 12:00 對應到 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
日期時間字串,或在省略時為 dateformat"yyyy-mm-dd\THH:MM:SS.s",來建構一個 DateTime
。
類似於 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
物件中指定的模式,或省略時為 dateformat"yyyy-mm-dd",解析 d
日期字串來建構 Date
。
類似於 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
,如果省略則為 dateformat"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
傳回與 Date
或 DateTime
的星期幾對應的完整星期名稱,以指定的 locale
為準。也接受 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
傳回一個 1 = 星期一,2 = 星期二,等等
的 Int64
週日期。
範例
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
調整 dt
,最多重複 limit
次,每次遞增 step
,直到 func
傳回 true
。func
必須接收單一 TimeType
參數,並傳回 Bool
。same
允許 dt
滿足 func
。
Dates.toprev
— 方法toprev(func::Function, dt::TimeType; step=Day(-1), limit=10000, same=false) -> TimeType
調整 dt
,最多重複 limit
次,每次遞增 step
,直到 func
傳回 true
。func
必須接收單一 TimeType
參數,並傳回 Bool
。same
允許 dt
滿足 func
。
期間
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
傳回輸入時間段的合理「預設」值,其中 T(1)
會傳回年、月和日,而 T(0)
會傳回小時、分鐘、秒和毫秒。
Dates.periods
— 函數Dates.periods(::CompoundPeriod) -> Vector{Period}
傳回組成給定 CompoundPeriod
的 Period
的 Vector
。
此函數需要 Julia 1.7 或更新版本。
取整函數
可以使用 floor
、ceil
或 round
將 Date
和 DateTime
值取整到指定的解析度(例如,1 個月或 15 分鐘)。
Base.floor
— 方法floor(dt::TimeType, p::Period) -> TimeType
傳回解析度為 p
時小於或等於 dt
的最近 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
傳回解析度為 p
時大於或等於 dt
的最近 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
的 Date
或 DateTime
,解析度為 p
。預設(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)
同時傳回解析度為 p
的 Date
或 DateTime
的 floor
和 ceil
。比個別呼叫 floor
和 ceil
更有效率。
floorceil(x::Period, precision::T) where T <: Union{TimePeriod, Week, Day} -> (T, T)
同時傳回解析度為 p
的 Period
的 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
,並以 Int64
傳回自捨入基準時間 (0000-01-01T00:00:00
) 以來的日數。
Dates.datetime2epochms
— 函數datetime2epochms(dt::DateTime) -> Int64
取得指定的 DateTime
,並以 Int64
傳回自捨入基準時間 (0000-01-01T00:00:00
) 以來的毫秒數。
轉換函數
Dates.today
— 函數today() -> Date
傳回 now()
的日期部分。
Dates.unix2datetime
— 函數unix2datetime(x) -> DateTime
取得自 Unix 基準時間 1970-01-01T00:00:00
以來的秒數,並轉換為對應的 DateTime
。
Dates.datetime2unix
— 函數datetime2unix(dt::DateTime) -> Float64
取得指定的 DateTime
,並以 Float64
傳回自 Unix 基準時間 1970-01-01T00:00:00
以來的秒數。
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 天數。
常數
星期
變數 | 縮寫 | 值 (Int) |
---|---|---|
星期一 | Mon | 1 |
星期二 | Tue | 2 |
星期三 | Wed | 3 |
星期四 | Thu | 4 |
星期五 | Fri | 5 |
星期六 | Sat | 6 |
星期日 | Sun | 7 |
月份
變數 | 縮寫 | 值 (Int) |
---|---|---|
一月 | 一月 | 1 |
二月 | Feb | 2 |
三月 | Mar | 3 |
四月 | Apr | 4 |
五月 | 五月 | 5 |
六月 | Jun | 6 |
七月 | Jul | 7 |
八月 | Aug | 8 |
九月 | Sep | 9 |
十月 | Oct | 10 |
十一月 | Nov | 11 |
十二月 | Dec | 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"