.NET で日付と時刻文字列を解析する

文字列を解析して DateTime オブジェクトに変換するには、日付と時刻がテキストとしてどのように表現されるのかを指定する必要があります。 異なるカルチャでは、日、月、年の並び順が異なります。 24 時間制を使用する時間表記があり、また "AM" および "PM" を指定する時間表記もあります。一部のアプリケーションは日付のみを必要とします。 時刻のみを必要とするアプリケーションもあります。 日付と時刻の両方を指定する必要があるアプリケーションもあります。 文字列を DateTime オブジェクトに変換するメソッドを使用すると、想定する書式、およびアプリケーションに必要な日付と時刻の要素について、詳しく指定できます。 テキストを正しく DateTime に変換するには、3 つのサブタスクが必要です。

  1. 日付と時刻を表すテキストについて、どのような書式を想定するのか指定する必要があります。
  2. 日時の書式に対してカルチャを指定できます。
  3. テキストの表現で不足している構成要素を、日付と時刻でどのように設定するのかを指定できます。

Parse メソッドと TryParse メソッドでは、多くの一般的な日付と時刻の表現を変換します。 ParseExact メソッドと TryParseExact メソッドでは、日付と時刻の書式指定文字列で指定されたパターンに適合する文字列形式を変換します。 詳細については、「標準の日時書式指定文字列」および「カスタム日時書式指定文字列」の記事をご覧ください。

現在の DateTimeFormatInfo オブジェクトでは、テキストを日付と時刻として解釈する方法について、より細かく制御できます。 DateTimeFormatInfo のプロパティでは、日付と時刻の区切り記号、月、曜日、時代 (年号) の名前、"AM" および "PM" を指定する書式について記述します。 CultureInfo.CurrentCulture によって返される CultureInfo には、現在のカルチャを表す CultureInfo.DateTimeFormat プロパティがあります。 特定のカルチャまたはカスタム設定が必要な場合は、解析メソッドの IFormatProvider パラメーターを指定します。 IFormatProvider パラメーターには、カルチャを表す CultureInfo オブジェクト、または DateTimeFormatInfo オブジェクトを指定します。

日付や時刻を表すテキストでは、一部の情報が不足している場合があります。 たとえば、ほとんどの人は、「3 月 12 日」という日付が今年の日付を表していると仮定するでしょう。 同様に、"2018年 3 月" は 2018 年の 3 月を表します。 多くの場合、時刻を表すテキストでは、時間、分、AM/PM の指定のみが含まれます。 解析メソッドでは、適切な既定値を使用して、この情報の不足が処理されます。

  • 時刻のみが存在する場合、日付には現在の日付が使用されます。
  • 日付のみが存在する場合、時刻には午前 0 時が使用されます。
  • 日付で年が指定されていない場合、現在の年が使用されます。
  • 月の日付が指定されていない場合、月の最初の日付が使用されます。

文字列内に日付が存在する場合、それには月、および日または年のいずれかが含まれている必要があります。 時刻が存在する場合、それには時間、および分または AM/PM 指定子のいずれかが含まれている必要があります。

NoCurrentDateDefault 定数を指定して、各既定値をオーバーライドできます。 この定数を使用する場合、不足しているすべての年、月、または日のプロパティは値 1 に設定されます。 Parse を使用する最後の例では、この動作について説明しています。

日付と時刻のコンポーネントだけでなく、日付と時刻の文字列形式には、世界協定時刻 (UTC) と何時間異なるかを示すオフセットを含めることができます。 たとえば、文字列 "2/14/2007 5:32:00 -7:00" は、UTC より 7 時間早い時刻を定義します。 オフセットが時刻の文字列形式から省略される場合、解析では、その Kind プロパティに DateTimeKind.Unspecified を設定して、DateTime オブジェクトを返します。 オフセットが指定されている場合、解析では、その Kind プロパティに DateTimeKind.Local を設定した DateTime オブジェクトが返されます。 また、その値は、コンピューターのローカル タイム ゾーンに調整されます。 解析メソッドで DateTimeStyles 値を使用することで、この動作を変更できます。

書式プロバイダーは、あいまいな数値の日付を解釈するためにも使用されます。 文字列 "02/03/04" で表される日付は、どの構成要素が月、日、年なのかはっきりしません。 構成要素は、書式プロバイダーにある類似した日付書式と同じ順序で解釈されます。

Parse

DateTime.Parse メソッドを使用して stringDateTime に変換する方法の例を次に示します。 この例では、現在のスレッドに関連付けられているカルチャを使用します。 現在のカルチャに関連付けられている CultureInfo で入力文字列を解析できない場合、FormatException がスローされます。

ヒント

この記事にあるすべての C# サンプルは、ブラウザーで実行できます。 出力を確認するには、 [実行] ボタンを押します。 また、サンプルを編集して自分で実験することもできます。

注意

これらの例は、C#Visual Basic 両方の GitHub ドキュメント リポジトリで使用可能です。

string dateInput = "Jan 1, 2009";
var parsedDate = DateTime.Parse(dateInput);
Console.WriteLine(parsedDate);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 00:00:00
Dim MyString As String = "Jan 1, 2009"
Dim MyDateTime As DateTime = DateTime.Parse(MyString)
Console.WriteLine(MyDateTime)
' Displays the following output on a system whose culture is en-US:
'       1/1/2009 00:00:00

文字列を解析するときに使用される書式規則を含むカルチャを、明示的に定義することもできます。 CultureInfo.DateTimeFormat プロパティによって返される標準 DateTimeFormatInfo オブジェクトのいずれかを指定します。 次の例では、書式プロバイダーを使用して、ドイツ語の文字列を DateTime に解析します。 これにより、de-DE カルチャを表す CultureInfo が作成されます。 この CultureInfo オブジェクトによって、この特定の文字列が正常に解析されます。 この処理によって、CurrentThreadCurrentCulture がどのように設定されていても除外されます。

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo);
Console.WriteLine(dateTime);
// The example displays the following output:
//       6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyDateTime)
' The example displays the following output:
'       6/12/2008 00:00:00

ただし、Parse メソッドのオーバーロードを使用してカスタム書式プロバイダーを指定することができます。 Parse メソッドでは非標準の書式の解析はサポートされません。 非標準の書式設定で示された日付と時刻を解析するには、代わりに ParseExact メソッドを使用します。

次の例では、DateTimeStyles 列挙体を使用して、未指定のフィールドの DateTime に現在の日付と時刻の情報を追加しないことを指定します。

var cultureInfo = new CultureInfo("de-DE");
string dateString = "12 Juni 2008";
var dateTime = DateTime.Parse(dateString, cultureInfo,
                                DateTimeStyles.NoCurrentDateDefault);
Console.WriteLine(dateTime);
// The example displays the following output if the current culture is en-US:
//      6/12/2008 00:00:00
Dim MyCultureInfo As New CultureInfo("de-DE")
Dim MyString As String = "12 Juni 2008"
Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo,
                           DateTimeStyles.NoCurrentDateDefault)
Console.WriteLine(MyDateTime)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 00:00:00

ParseExact

DateTime.ParseExact メソッドでは、文字列が指定された文字列パターンのいずれかに準拠する場合、文字列を DateTime オブジェクトに変換します。 指定された形式のいずれでもない文字列がこのメソッドに渡された場合、FormatException がスローされます。 標準の日付と時刻の書式指定子のいずれか、またはカスタムの書式指定子の組み合わせを指定することができます。 カスタムの書式指定子を使用すると、カスタムの認識文字列を構成することができます。 指定子の詳細については、標準の日付と時刻の書式指定文字列カスタムの日付と時刻の書式指定文字列に関する記事をご覧ください。

次の例では、DateTime.ParseExact メソッドに、解析する文字列オブジェクト、書式指定子、CultureInfo オブジェクトが順に渡されます。 この ParseExact メソッドでは、en-US カルチャの長い日付パターンに従う文字列のみを解析できます。

var cultureInfo = new CultureInfo("en-US");
string[] dateStrings = { " Friday, April 10, 2009", "Friday, April 10, 2009" };
foreach (string dateString in dateStrings)
{
    try
    {
        var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo);
        Console.WriteLine(dateTime);
    }
    catch (FormatException)
    {
        Console.WriteLine("Unable to parse '{0}'", dateString);
    }
}
// The example displays the following output:
//       Unable to parse ' Friday, April 10, 2009'
//       4/10/2009 00:00:00
Dim MyCultureInfo As New CultureInfo("en-US")
Dim MyString() As String = {" Friday, April 10, 2009", "Friday, April 10, 2009"}
For Each dateString As String In MyString
    Try
        Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D",
                                                     MyCultureInfo)
        Console.WriteLine(MyDateTime)
    Catch e As FormatException
        Console.WriteLine("Unable to parse '{0}'", dateString)
    End Try
Next
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 00:00:00

Parse メソッドと ParseExact メソッドの各オーバーロードには、IFormatProvider パラメーターもあります。このパラメーターでは、文字列の書式設定に関するカルチャ固有の情報が指定されます。 この IFormatProvider オブジェクトは、標準的なカルチャを表す CultureInfo オブジェクトか、CultureInfo.DateTimeFormat プロパティによって返される DateTimeFormatInfo オブジェクトです。 ParseExact では、日付と時刻のカスタム書式を 1 つ以上定義する、文字列または文字列配列の追加の引数も使用されます。

関連項目