DateTimeStylesの空白に関するオプションには次のようなものがあります。
- AllowLeadingWhite
- 文字列中の日時に先行する空白文字を無視する。
- AllowTrailingWhite
- 文字列中の日時に後続する空白文字を無視する。
- AllowInnerWhite
- 文字列中の日時の途中に存在する空白文字を無視する。
- AllowWhiteSpaces
- 文字列中の日時に含まれる空白文字を無視する。
(上記のAllowLeadingWhite, AllowTrailingWhite, AllowInnerWhiteを組み合わせたものと同じ)
これらのオプションは厳密に書式を指定するParseExactメソッドで特に効果を発揮します。 書式だけでは定義できない空白の表記ゆれを許容するかどうかをこのオプションで指定することが出来ます。 次の表は、様々な個所に空白を含む文字列をParseExactメソッドで解析した場合の結果の違いをまとめたものです。
DateTime/DateTimeOffset.TryParseExactメソッドでDateTimeStylesを指定して文字列中の空白の扱いを指定する
using System;
using System.Globalization;
class Sample {
static void Main()
{
var format = "yyyy-M-d"; // "年-月-日"(0埋めなし)の書式
var inputs = new string[] {
// ISO8601形式の文字列
"2013-04-01", // 空白を含まない
" 2013-04-01", // 空白が先行する
"2013-04-01 ", // 空白が後続する
" 2013-04-01 ", // 前後に空白がある
"2013- 4-01", // 年と月の間に空白がある
"2013 - 4 - 1", // 年月日と区切り記号の間に空白がある
" 2013 -4 - 1 ", // 上記の例の複合
};
var styles = new DateTimeStyles[] {
DateTimeStyles.None,
DateTimeStyles.AllowLeadingWhite,
DateTimeStyles.AllowTrailingWhite,
DateTimeStyles.AllowInnerWhite,
DateTimeStyles.AllowWhiteSpaces,
};
// DateTimeStylesとDateTimeへの変換結果の違いを表示
Console.WriteLine("DateTime.ParseExact");
Console.WriteLine("{0,-20}|{1,-22}|{2,-22}|{3,-22}|{4,-22}|{5,-22}",
"(input)",
"None",
"AllowLeadingWhite",
"AllowTrailingWhite",
"AllowInnerWhite",
"AllowWhiteSpaces");
foreach (var input in inputs) {
Console.Write("{0,-20}|", "'" + input + "'");
foreach (DateTimeStyles style in styles) {
DateTime dt;
if (DateTime.TryParseExact(input, format, null, style, out dt))
Console.Write("{0,-22}|", dt);
else
Console.Write("{0,-22}|", "(false)");
}
Console.WriteLine();
}
Console.WriteLine();
// DateTimeStylesとDateTimeOffsetへの変換結果の違いを表示
Console.WriteLine("DateTimeOffset.ParseExact");
Console.WriteLine("{0,-20}|{1,-28}|{2,-28}|{3,-28}|{4,-28}|{5,-28}",
"(input)",
"None",
"AllowLeadingWhite",
"AllowTrailingWhite",
"AllowInnerWhite",
"AllowWhiteSpaces");
foreach (var input in inputs) {
Console.Write("{0,-20}|", "'" + input + "'");
foreach (DateTimeStyles style in styles) {
DateTimeOffset dto;
if (DateTimeOffset.TryParseExact(input, format, null, DateTimeStyles.AssumeLocal | style, out dto))
Console.Write("{0,-28}|", dto);
else
Console.Write("{0,-28}|", "(false)");
}
Console.WriteLine();
}
Console.WriteLine();
}
}
実行結果
DateTime.ParseExact (input) |None |AllowLeadingWhite |AllowTrailingWhite |AllowInnerWhite |AllowWhiteSpaces '2013-04-01' |2013/04/01 0:00:00 |2013/04/01 0:00:00 |2013/04/01 0:00:00 |2013/04/01 0:00:00 |2013/04/01 0:00:00 | ' 2013-04-01' |(false) |2013/04/01 0:00:00 |(false) |2013/04/01 0:00:00 |2013/04/01 0:00:00 | '2013-04-01 ' |(false) |(false) |2013/04/01 0:00:00 |(false) |2013/04/01 0:00:00 | ' 2013-04-01 ' |(false) |(false) |(false) |(false) |2013/04/01 0:00:00 | '2013- 4-01' |(false) |(false) |(false) |2013/04/01 0:00:00 |2013/04/01 0:00:00 | '2013 - 4 - 1' |(false) |(false) |(false) |2013/04/01 0:00:00 |2013/04/01 0:00:00 | ' 2013 -4 - 1 ' |(false) |(false) |(false) |(false) |2013/04/01 0:00:00 | DateTimeOffset.ParseExact (input) |None |AllowLeadingWhite |AllowTrailingWhite |AllowInnerWhite |AllowWhiteSpaces '2013-04-01' |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 | ' 2013-04-01' |(false) |2013/04/01 0:00:00 +09:00 |(false) |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 | '2013-04-01 ' |(false) |(false) |2013/04/01 0:00:00 +09:00 |(false) |2013/04/01 0:00:00 +09:00 | ' 2013-04-01 ' |(false) |(false) |(false) |(false) |2013/04/01 0:00:00 +09:00 | '2013- 4-01' |(false) |(false) |(false) |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 | '2013 - 4 - 1' |(false) |(false) |(false) |2013/04/01 0:00:00 +09:00 |2013/04/01 0:00:00 +09:00 | ' 2013 -4 - 1 ' |(false) |(false) |(false) |(false) |2013/04/01 0:00:00 +09:00 |
なお、この例では日付のみを解析する際に時刻をローカル時刻であると仮定するために、DateTimeOffset.ParseExactの呼び出し時にDateTimeStyles.AssumeLocalを指定しています。