ujimushi(@旧sradjp(15364))の日記

旧スラドの日記の引越先です

ISO8601 year week formatting[勝手に回答]

今回はJulia Discourseから ISO8601 year week formatting, ISO-8601の何年の第何週かを得る方法はどうしたらいい?という質問です。

質問に対して何人かが言及している通り,週番号はweek(dt)で取れるようですが, ISO-8601の何年の週かは自分で実装しないといけないようです。

ISO 8601によると, その年の第1週は1月の第1木曜日が含まれる週だとか。

ということはその週の木曜日はfirstdayofweek(dt) + Day(3)となり, この日のを取得すればいけそうです。

ということで SQL‘IYYY-IW'相当の文字列を得る方法は次の実装が一例となります。

using Dates

function iso8601year_and_week(dt::Date)
    string(year(firstdayofweek(dt) + Day(3)),
           "-", lpad(week(dt), 2, '0'))
end
julia> iso8601year_and_week(Date(2024,12,31))
"2025-01"

2025-03-26 19:51頃 追記

もう少し細かく関数を作ってみた実装は次のような感じです。 (さらにやっつけ感が増してますが…)

using Dates

isoyear(dt::TimeType) = year(firstdayofweek(dt) + Day(3))
iyyy(dt::TimeType) = string(isoyear(dt))
iw(dt::TimeType) = lpad(week(dt), 2, '0')
week_not_iso(dt::TimeType) = round(Int64, (dt - firstdayofyear(dt)) / Week(1), RoundDown) + 1
ww(dt::TimeType) = lpad(week_not_iso(dt), 2, '0')


iyyy_iw(dt) = iyyy(dt) * "-" * iw(dt)
yyyy_ww(dt) = string(year(dt), "-", ww(dt))
julia> isoyear(Date(2024,12,31))
2025

julia> iyyy(Date(2024,12,31))
"2025"

julia> iw(Date(2024,12,31))
"01"

julia> week_not_iso(Date(2024,12,31))
53

julia> ww(Date(2024,12,31))
"53"

julia> iyyy(Date(2024,12,31))
"2025"

julia> iyyy_iw(Date(2024,12,31))
"2025-01"

julia> yyyy_ww(Date(2024,12,31))
"2024-53"