今回は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"