タイムゾーン・時刻の種類に関するオプションのうち、AssumeLocal
およびAssumeUniversal
は文字列中の日時がどのタイムゾーンも表さない場合にローカル時刻もしくはUTCと見なすように指定するオプションです。 当然、オフセット値が指定されている場合は、その値が使用されます。
DateTime/DateTimeOffset.ParseExactメソッドでDateTimeStylesを指定し、時刻をローカル時刻またはUTCとみなして変換する
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.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.AssumeLocal, // 時刻はローカル時刻とみなす
DateTimeStyles.AssumeUniversal, // 時刻はUTCとみなす
};
// 文字列をDateTimeへ変換
Console.WriteLine("DateTime.ParseExact");
foreach (var input in inputs) {
foreach (var style in styles) {
var dt = DateTime.ParseExact(input, "o", null, style);
Console.WriteLine("{0,-35} ({1,-15}) -> {2} ({3})", input, style, dt, dt.Kind);
}
Console.WriteLine();
}
Console.WriteLine();
// 文字列をDateTimeOffsetへ変換
Console.WriteLine("DateTimeOffset.ParseExact");
foreach (var input in inputs) {
foreach (var style in styles) {
try {
var dto = DateTimeOffset.ParseExact(input, "o", null, style);
Console.WriteLine("{0,-35} ({1,-15}) -> {2}", input, style, dto);
}
catch (FormatException) {
Console.WriteLine("{0,-35} ({1,-15}) -> (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.1234567 (AssumeLocal ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567 (AssumeUniversal) -> 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+00:00 (AssumeLocal ) -> 2013/04/02 0:00:30 (Local) 2013-04-01T15:00:30.1234567+00:00 (AssumeUniversal) -> 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+09:00 (AssumeLocal ) -> 2013/04/01 15:00:30 (Local) 2013-04-01T15:00:30.1234567+09:00 (AssumeUniversal) -> 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-05:00 (AssumeLocal ) -> 2013/04/02 5:00:30 (Local) 2013-04-01T15:00:30.1234567-05:00 (AssumeUniversal) -> 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.1234567 (AssumeLocal ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567 (AssumeUniversal) -> 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+00:00 (AssumeLocal ) -> 2013/04/01 15:00:30 +00:00 2013-04-01T15:00:30.1234567+00:00 (AssumeUniversal) -> 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+09:00 (AssumeLocal ) -> 2013/04/01 15:00:30 +09:00 2013-04-01T15:00:30.1234567+09:00 (AssumeUniversal) -> 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-05:00 (AssumeLocal ) -> 2013/04/01 15:00:30 -05:00 2013-04-01T15:00:30.1234567-05:00 (AssumeUniversal) -> 2013/04/01 15:00:30 -05:00