DateTime/DateTimeOffsetでは、標準の書式指定子O
/o
(書式指定子 §.O, o (round-trip date/time))またはs
(書式指定子 §.s (sortable date/time))によってISO 8601の拡張形式で文字列化することができます。 ただし、いずれの書式でも日付部分には(グレゴリオ暦での)年月日が用いられます。
ISOWeekクラスには日付をISO週暦での年・週・曜日を用いた形式で文字列化するメソッドは用意されておらず、また(少なくとも.NET 5時点では)標準の書式指定子にもそういった書式は用意されていません。 そのため、必要な場合はISOWeekクラスのメソッドを組み合わせて独自に実装する必要があります。
ISO週暦での日付をISO 8601拡張形式で文字列化する
Imports System
Imports System.Globalization
Class Sample
Shared Function GetISOWeekdayNumber(ByVal d As DateTime) As Integer
Return If(d.DayOfWeek = DayOfWeek.Sunday, 7, CInt(d.DayOfWeek))
End Function
' DateTimeで与えられる日付をISO 8601拡張形式(年・週・曜日)で文字列化する
Shared Function ToISO8601WeekDateFormatString(ByVal d As DateTime) As String
Return String.Format(
"{0:D4}-W{1:D2}-{2:D2}",
ISOWeek.GetYear(d), ' DateTimeに対応するISO週年を取得
ISOWeek.GetWeekOfYear(d), ' DateTimeに対応するISO週番号を取得
GetISOWeekdayNumber(d) ' DateTimeに対応するISO曜日番号を取得
)
End Function
Shared Sub Main()
Dim dates As DateTime() = {
New DateTime(2019, 12, 29),
New DateTime(2019, 12, 30),
New DateTime(2020, 1, 1),
New DateTime(2020, 6, 30),
New DateTime(2020, 12, 31),
New DateTime(2021, 1, 3),
New DateTime(2021, 12, 31)
}
For Each d As DateTime In dates
' ISO 8601拡張形式の年・月・日(秒の端数部を除く)および年・週・曜日の書式で文字列化する
Console.WriteLine(
"{0} => {1}",
d.ToString("s"),
ToISO8601WeekDateFormatString(d)
)
Next
End Sub
End Class
実行結果
2019-12-29T00:00:00 => 2019-W52-07 2019-12-30T00:00:00 => 2020-W01-01 2020-01-01T00:00:00 => 2020-W01-03 2020-06-30T00:00:00 => 2020-W27-02 2020-12-31T00:00:00 => 2020-W53-04 2021-01-03T00:00:00 => 2020-W53-07 2021-12-31T00:00:00 => 2021-W52-05