Julia 日付と時刻

Julia は Dates モジュールを通じて、日付と時刻を処理するための以下の3つの関数を提供しています:

  • Date:日付を表し、日まで正確で、日付のみを表示します。
  • DateTime:日付と時刻を表し、ミリ秒まで正確です。
  • DateTime:時刻を表し、ナノ秒まで正確で、1日24時間の中の特定の時刻を表します。

使用する前に、Dates モジュールをインポートする必要があります:

import Dates

Date と DateTime 型は、整数または Period 型で解析できます。

Period は日付値に基づき、年、月、日などを表します:

Period
Year
Quarter
Month
Week
Day
Hour
Minute
Second
Millisecond
Microsecond
Nanosecond

Date と DateTime はどちらも抽象型 TimeType のサブタイプです。

下図は日付型間の関係を示しています。画像をクリックすると拡大表示できます:

日付の時刻を出力する:

例

julia> import Dates

julia> rightnow = Dates.Time(Dates.now()) # 時刻
08:41:15.917

julia> theday = Dates.Date(2022,5,6) # 日付
2022-05-06

julia> today_date = Dates.today()
2022-05-11

julia> Dates.now(Dates.UTC)
2022-05-11T00:44:20.136

# 時刻をフォーマット
julia> Dates.DateTime("20220429 120000", "yyyymmdd HHMMSS")
2022-04-29T12:00:00


julia> Dates.DateTime("19/04/2022 17:42", "dd/mm/yyyy HH:MM")
2022-04-19T17:42:00

以下の表は日付フォーマットコードを示しています。これらを使って日付をフォーマットできます:

文字 日付/時刻 要素
Y 年を表します。例: yyyy => 1984, yy => 84
m 月を表します。例: m => 7 or 07
u 月の短縮名を表します。例: Jun
U 月の完全な名前を表します。例: January
e 曜日の短縮名を表します。例: Mon
E 曜日の完全な名前を表します。例: Monday
d 日を表します。例: 1 or 01
H 時を表します。例: HH => 00
M 分を表します。例: MM => 00
S 秒を表します。例: S => 00
s ミリ秒を表します。例: .000

例

julia> Dates.Date("Sun, 27 Sep 2022", "e, d u y")
2022-09-27

julia> Dates.DateTime("Sun, 27 Sep 2022 10:25:10", "e, d u y H:M:S")
2022-09-27T10:25:10

上記の例で、いくつかの日付時刻オブジェクトを作成しました。次に、これらのオブジェクトを使用してデータ(年、月、日、分、秒、時など)を取得できます:

例

julia> theday = Dates.Date(2022,5,6) # 日付オブジェクトを作成
2022-05-06

# 次に theday のデータを取得
julia> Dates.year(theday)
2022

julia> Dates.month(theday)
5

# 現在時刻のデータを取得
julia> rightnow = Dates.now()
2022-05-11T08:51:45.342

julia> Dates.minute(rightnow)
51

julia> Dates.hour(rightnow)
8

julia> Dates.second(rightnow)
45

# 月と曜日を取得
julia> Dates.dayofweek(theday)
5

julia> Dates.dayname(theday)
"Friday"

julia> Dates.yearmonthday(theday)
(2022, 5, 6)

julia> Dates.dayofweekofmonth(theday)
1

日付の演算

日付オブジェクトに対して算術演算を行うことができます。

たとえば、2つの日付の差が何日かを計算します:

例

julia> day1 = Dates.Date(2022,1,17)
2022-01-17

julia> day2 = Dates.Date(2022,3,23)
2022-03-23

julia> day2 - day1
65 days

# 異なる時間単位を使用
julia> Dates.canonicalize(Dates.CompoundPeriod(day2 - day1))
9 weeks, 2 days

日付を加算することもできます。たとえば、2年6か月後の日付を計算します:

例

julia> rightnow = Dates.now()
2022-05-11T09:01:07.946

julia> rightnow + Dates.Year(20) + Dates.Month(6)
2042-11-11T09:01:07.946

# 6日後の日付
julia> rightnow + Dates.Day(6)
2022-05-17T09:01:07.946

日付の範囲

Julia は、反復可能な range(範囲) オブジェクトを使用して、指定された範囲の日付を作成できます。次の例では、毎月1日を生成するイテレータを作成します。

例

date_range = Dates.Date(2011,1,1):Dates.Month(1):Dates.Date(2022,1,1)
Dates.Date("2011-01-01"):Dates.Month(1):Dates.Date("2022-01-01")

上記の範囲オブジェクトの中から、どの日が平日に該当するかを見つけることができます。ここでは filter() のために、指定された日付が平日かどうかを判定する匿名関数を作成する必要があります:

例

julia> weekdaysfromrange = filter(dy -> Dates.dayname(dy) != "Saturday" && Dates.dayname(dy) != "Sunday" , date_range)
94-element Vector{Dates.Date}:
 2011-02-01
 2011-03-01
 2011-04-01
 2011-06-01
 2011-07-01
 2011-08-01
 2011-09-01
 2011-11-01
 2011-12-01
 2012-02-01
 ⋮
 2021-02-01
 2021-03-01
 2021-04-01
 2021-06-01
 2021-07-01
 2021-09-01
 2021-10-01
 2021-11-01
 2021-12-01

日付と時刻の丸め

私たちは通常、round()、floor()、ceil() 関数を使用して引数を切り上げまたは切り捨てます。同様に、これらの関数は日付を丸めて、日付を時間的に前後に調整するためにも使用できます。

例

julia> Dates.now()
2022-05-11T09:17:49.824

julia> Dates.format(round(Dates.DateTime(Dates.now()), Dates.Minute(15)), Dates.RFC1123Format)
"Wed, 11 May 2022 09:15:00"

ceil()関数は以下のように日付/時刻を前方に調整します:

例

julia> theday = Dates.Date(2022,5,6)
2022-05-06

# 来月
julia> ceil(theday, Dates.Month)
2022-06-01

# 来年
julia> ceil(theday, Dates.Year)
2023-01-01

# 来週
julia> ceil(theday, Dates.Week)
2022-05-09

繰り返し日付

範囲内の繰り返し日付を見つけることができます。たとえば、毎週日曜日など:

例

# 範囲の日付を作成
julia> date_range = Dates.Date(2011,1,1):Dates.Month(1):Dates.Date(2022,1,1)
Dates.Date("2011-01-01"):Dates.Month(1):Dates.Date("2022-01-01")
# filter() 関数を使用して毎週日曜日を抽出
julia> filter(d -> Dates.dayname(d) == "Sunday", date_range)
20-element Vector{Dates.Date}:
 2011-05-01
 2012-01-01
 2012-04-01
 2012-07-01
 2013-09-01
 2013-12-01
 2014-06-01
 2015-02-01
 2015-03-01
 2015-11-01
 2016-05-01
 2017-01-01
 2017-10-01
 2018-04-01
 2018-07-01
 2019-09-01
 2019-12-01
 2020-03-01
 2020-11-01
 2021-08-01
Unix 時間

UNIX 時間、または POSIX 時間は、UNIX または UNIX 系システムで使用される時間表現方式です:UTC 1970年1月1日 0時0分0秒から現在までの総秒数であり、うるう秒は考慮しません。

time() 関数は Unix 値を返します:

例

julia> time()
1.652232489777e9

unix2datetime() 関数は Unix 時間を日付/時刻オブジェクトに変換します:

例

julia> Dates.unix2datetime(time())
2022-05-11T01:28:23.493

現在の時刻

DateTime はミリ秒単位です。Dates.value 関数を使用すると、ミリ秒単位の時間を取得できます:

例

julia> moment=Dates.now()
2022-05-11T09:31:31.037

julia> Dates.value(moment)
63787944691037

julia> moment.instant
Dates.UTInstant{Millisecond}(Millisecond(63787944691037))

時間と計測

Julia は私たちに次のものを提供しています:@elapsedマクロ。これは、式の実行に必要な時間(秒数)を返します。

次のコードの実行に必要な時間を計算します:

例

julia> function foo(n)
         for i in 1:n
           x = sin(rand())
         end
       end
foo (generic function with 1 method)


julia> @elapsed foo(100000000)
1.360567967

julia> @time foo(100000000)
  1.363258 seconds

その他の例

例

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
その他の拡張