タイムゾーン・時刻の種類に関するオプションのうち、AdjustToUniversal
およびRoudtripKind
は解析した日時の補正に関するオプションです。
AdjustToUniversal
が指定された場合は、解析した日時をUTCに補正します。 このため、DateTime.Kindは常にDateTimeKind.Utc
、DateTimeOffset.Offsetは00:00:00
となります。 文字列中の日時がどのタイムゾーンも表さない場合、時刻の補正は行われず、DateTime.KindにはDateTimeKind.Unspecified
が設定されます。
一方RoudtripKind
が指定された場合は、解析した日時の種類とタイムゾーン情報を維持します。 時刻にZ
やGMT
などのUTCであることを表す文字列が含まれていれば、DateTimeKind.Utc
として扱われます。 このオプションはDateTimeOffsetでは無視されます。
DateTime/DateTimeOffset.ParseExactメソッドでDateTimeStylesを指定し、変換した時刻のオフセットを補正または維持する
using System;
using System.Globalization;
class Sample {
static void Main()
{
var inputs = new string[] {
"2013-04-01T15:00:30.1234567", // タイムゾーンの明記無し
"2013-04-01T15:00:30.1234567Z", // UTCでの時刻
"2013-04-01T15:00:30.1234567+00:00", // UTC+0での時刻
"2013-04-01T15:00:30.1234567+09:00", // UTC+9での時刻
"2013-04-01T15:00:30.1234567-05:00", // UTC-5での時刻
};
var styles = new DateTimeStyles[] {
DateTimeStyles.None, // オプション指定なし (デフォルトの動作)
DateTimeStyles.AdjustToUniversal, // 時刻をUTCに補正する
DateTimeStyles.RoundtripKind, // 時刻のタイムゾーン情報を維持する
};
// 文字列をDateTimeへ変換
Console.WriteLine("DateTime.ParseExact");
foreach (var style in styles) {
foreach (var input in inputs) {
var dt = DateTime.ParseExact(input, "o", null, style);
Console.WriteLine("{0,-35} ({1,-18}) -> {2} ({3})", input, style, dt, dt.Kind);
}
Console.WriteLine();
}
Console.WriteLine();
// 文字列をDateTimeOffsetへ変換
Console.WriteLine("DateTimeOffset.ParseExact");
foreach (var style in styles) {
foreach (var input in inputs) {
try {
var dto = DateTimeOffset.ParseExact(input, "o", null, style);
Console.WriteLine("{0,-35} ({1,-18}) -> {2}", input, style, dto);
}
catch (FormatException) {
Console.WriteLine("{0,-35} ({1,-18}) -> (FormatException)", input, style);
}
}
Console.WriteLine();
}
Console.WriteLine();
}
}
UTC+9の環境での実行結果例
DateTime.ParseExact 2013-04-01T15:00:30.1234567 (None ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (None ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+00:00 (None ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (None ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (None ) -> 2013/04/02 5:00:30 (Local) 2013-04-01T15:00:30.1234567 (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+00:00 (AdjustToUniversal ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+09:00 (AdjustToUniversal ) -> 2013/04/01 6:00:30 (Utc) 2013-04-01T15:00:30.1234567-05:00 (AdjustToUniversal ) -> 2013/04/01 20:00:30 (Utc) 2013-04-01T15:00:30.1234567 (RoundtripKind ) -> 2013/04/01 15:00:30 (Unspecified) 2013-04-01T15:00:30.1234567Z (RoundtripKind ) -> 2013/04/01 15:00:30 (Utc) 2013-04-01T15:00:30.1234567+00:00 (RoundtripKind ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (RoundtripKind ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (RoundtripKind ) -> 2013/04/02 5:00:30 (Local) DateTimeOffset.ParseExact 2013-04-01T15:00:30.1234567 (None ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567Z (None ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (None ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (None ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567-05:00 (None ) -> 2013/04/01 15:00:30 -05:00 2013-04-01T15:00:30.1234567 (AdjustToUniversal ) -> 2013/04/01 6:00:30 +00:00 2013-04-01T15:00:30.1234567Z (AdjustToUniversal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (AdjustToUniversal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (AdjustToUniversal ) -> 2013/04/01 6:00:30 +00:00 2013-04-01T15:00:30.1234567-05:00 (AdjustToUniversal ) -> 2013/04/01 20:00:30 +00:00 2013-04-01T15:00:30.1234567 (RoundtripKind ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567Z (RoundtripKind ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (RoundtripKind ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+09:00 (RoundtripKind ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567-05:00 (RoundtripKind ) -> 2013/04/01 15:00:30 -05:00