日期

Dates 模組提供兩種用於處理日期的類型:DateDateTime,分別代表天和毫秒精度;兩者都是抽象 TimeType 的子類型。區分這兩種類型的動機很簡單:某些操作在不必處理較高精度的複雜性時,無論是在程式碼或心智推理方面,都會變得更簡單。例如,由於 Date 類型僅解析為單一日期的精度(即沒有小時、分鐘或秒),因此時區、夏令時間和閏秒的正常考量便不必要且可避免。

DateDateTime 基本上都是不可變的 Int64 包裝器。這兩種類型的單一 instant 欄位實際上是 UTInstant{P} 類型,它表示一個基於 UT 秒的持續增加機器時間軸 [1]DateTime 類型不認識時區(在 Python 術語中稱為「樸素」),類似於 Java 8 中的 LocalDateTime。可以透過 TimeZones.jl 套件 來新增額外時區功能,該套件會編譯 IANA 時區資料庫DateDateTime 都是基於 ISO 8601 標準,遵循前儒略曆。請注意,ISO 8601 標準特別注意西元前/公元前日期。一般而言,西元前/公元前時代的最後一天,西元前 1-12-31,接著是西元後 1-1-1,因此沒有西元 0 年。然而,ISO 標準指出西元前 1 年是西元 0 年,因此 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」等。類似於其他名稱=>值對應函式 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 函式,並加上一個型別為 DateFormat 的第三個引數來指定格式,從字串建立 DateDateTime;例如,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 中找到一組完整的解析和格式化測試和範例。

Durations/Comparisons

找出兩個 DateDateTime 之間的時間長度很簡單,因為它們的底層表示分別為 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

存取函式

因為 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

而大寫則會傳回對應 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 算術時,盡量少做變更。這種方法通常也稱為日曆算術,或者如果您在對話中詢問某人相同的計算,您可能會猜到的方法。為什麼對此大驚小怪?讓我們舉一個經典的例子:在 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

接下來的兩個高階方法 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-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

捨入

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 日期日期時間 值是根據 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 天 = 地球自轉一圈)的機器時間軸。TPeriod 參數,表示即時的解析度或精確度。

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 函數

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最小寬度的數字月
u一月根據 locale 將月份名稱縮寫為 3 個字元
U一月根據 locale 關鍵字的完整月份名稱
d1, 31最小寬度的月份天數
H0, 23最小寬度的小時(24 小時時鐘)
M0, 59最小寬度的分鐘
S0, 59最小寬度的秒
s000, 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 字串

代碼符合註解
Y1996, 96傳回 1996、0096 年
y1996, 96parse 上的 Y 相同,但會捨棄 format 上的過多位數
m1, 01符合 1 或 2 位數的月份
u一月根據 locale 關鍵字符合縮寫月份
U一月根據 locale 關鍵字符合完整月份名稱
d1, 01符合 1 或 2 位數的日期
H00符合小時(24 小時制)
I00用於輸出 12 小時制的時
M00符合分鐘
S00符合秒
s.500符合毫秒
e週一、週二符合縮寫星期
E星期一符合星期全名
p上午符合 AM/PM(不分大小寫)
yyyymmdd19960101符合固定寬度的年、月、日

未列於上方的字元通常視為日期和時間區隔之間的分隔符。例如「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 規格符號解析時間時,任何小時(HI)都將解釋為 12 小時制,因此 I 碼主要用於輸出。

建立一個 DateFormat 物件很昂貴。只要有可能,建立一次並多次使用,或嘗試使用 dateformat"" 字串巨集。使用這個巨集會在巨集擴充時間建立 DateFormat 物件一次,並在稍後重複使用。還有幾個 預先定義的格式化器,稍後列出。

請參閱 DateTimeformat,瞭解如何分別使用 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 轉換為 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 物件中指定的模式,或省略時為 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 轉換為 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,如果省略則為 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

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

傳回與 DateDateTime 的星期幾對應的完整星期名稱,以指定的 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 中的 DateDateTime 週日期對應的縮寫名稱。也接受 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

一個 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

傳回給定 locale 中的 DateDateTimeInteger 的月份全名。

範例

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 中的 DateDateTimeInteger 的月份縮寫名稱。

範例

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 傳回 truefunc 必須接收單一 TimeType 參數,並傳回 Boolsame 允許 dt 滿足 func

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

調整 dt,最多重複 limit 次,每次遞增 step,直到 func 傳回 truefunc 必須接收單一 TimeType 參數,並傳回 Boolsame 允許 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

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

傳回輸入時間段的合理「預設」值,其中 T(1) 會傳回年、月和日,而 T(0) 會傳回小時、分鐘、秒和毫秒。

Dates.periods函數
Dates.periods(::CompoundPeriod) -> Vector{Period}

傳回組成給定 CompoundPeriodPeriodVector

Julia 1.7

此函數需要 Julia 1.7 或更新版本。

取整函數

可以使用 floorceilroundDateDateTime 值取整到指定的解析度(例如,1 個月或 15 分鐘)。

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

傳回解析度為 p 時小於或等於 dt 的最近 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

傳回解析度為 p 時大於或等於 dt 的最近 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

傳回最接近 dtDateDateTime,解析度為 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(預設)、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)

同時傳回解析度為 pDateDateTimefloorceil。比個別呼叫 floorceil 更有效率。

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

同時傳回解析度為 pPeriodfloorceil。比個別呼叫 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,並以 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

回傳自給定的 DateDateTime 以來的 Rata Die 天數。

常數

星期

變數縮寫值 (Int)
星期一Mon1
星期二Tue2
星期三Wed3
星期四Thu4
星期五Fri5
星期六Sat6
星期日Sun7

月份

變數縮寫值 (Int)
一月一月1
二月Feb2
三月Mar3
四月Apr4
五月五月5
六月Jun6
七月Jul7
八月Aug8
九月Sep9
十月Oct10
十一月Nov11
十二月Dec12

常見日期格式化器

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 小時,並且在使用日曆日期時會導致更自然的計算。