Share via


日付と時刻文字列の解析

解析メソッドは、日付と時刻の文字列形式を、等価の DateTime オブジェクトに変換します。 Parse メソッドと TryParse メソッドは、複数ある日付と時刻の共通形式をどれでも変換します。 ParseExact メソッドと TryParseExact メソッドは、日時書式指定文字列で指定されるパターンに準拠する文字列形式を変換します (標準の日時書式指定文字列およびカスタム日時書式指定文字列に関するトピックを参照してください)。

解析は、日付と時刻の区切り記号に使用される文字列または月、日、年号の名前などの情報を提供する書式プロバイダーのプロパティに影響されます。 書式プロバイダーは、現在の DateTimeFormatInfo オブジェクトであり、現在のスレッド カルチャによって暗黙的に指定されるか、または解析メソッドの IFormatProvider パラメーターによって明示的に指定されます。 IFormatProvider パラメーターには、カルチャを表す CultureInfo オブジェクト、または DateTimeFormatInfo オブジェクトを指定します。

解析される日付の文字列形式には、月と、日または年の少なくともどちらかが含まれている必要があります。 時刻の文字列形式には、時間と、分または AM/PM 指定子の少なくともどちらかが含まれている必要があります。 ただし可能であれば、省略された構成要素に対して解析が既定値を使用します。 日付がない場合は現在の日付、年がない場合は現在の年、月の日付がない場合はその月の初日、時刻がない場合は午前 0 時が、それぞれ既定で設定されます。

文字列形式が時刻のみを指定している場合は、解析が DateTime オブジェクトの YearMonth、および Day の各プロパティを Today プロパティの対応する値に設定して、このオブジェクトを返します。 ただし、解析メソッドに NoCurrentDateDefault 定数が指定された場合は、結果の年、月、および日の各プロパティが値 1 に設定されます。

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

書式プロバイダーは、あいまいな数値の日付を解釈する際にも使用されます。 たとえば、文字列 "02/03/04" で表された日付は、どの構成要素が月、日、年であるかが明確ではありません。 この場合は、書式プロバイダーの類似する日付形式の順序に従って構成要素が解釈されます。

Parse

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

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 12:00:00 AM
string MyString = "Jan 1, 2009";
DateTime MyDateTime = DateTime.Parse(MyString);
Console.WriteLine(MyDateTime);
// Displays the following output on a system whose culture is en-US:
//       1/1/2009 12:00:00 AM

カルチャの 1 つを定義するように CultureInfo を設定して、そのオブジェクトを指定するか、CultureInfo.DateTimeFormat プロパティによって返される標準の DateTimeFormatInfo オブジェクトの 1 つを指定することもできます。 書式プロバイダーを使用してドイツ語文字列を DateTime に変換するコード例を次に示します。 この文字列を正しく解析するには、de-DE (ドイツのドイツ語) カルチャを表す CultureInfo を定義し、解析する文字列と共に渡します。 これにより、CurrentThreadCurrentCulture の設定が無視されます。

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
      Dim MyString As String = "12 Juni 2008"
      Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo)
      Console.WriteLine(MyDateTime)
   End Sub
End Module
' The example displays the following output:
'       6/12/2008 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo MyCultureInfo = new CultureInfo("de-DE");
      string MyString = "12 Juni 2008";
      DateTime MyDateTime = DateTime.Parse(MyString, MyCultureInfo);
      Console.WriteLine(MyDateTime);
   }
}
// The example displays the following output:
//       6/12/2008 12:00:00 AM

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

DateTimeStyles 列挙体を使用して、文字列で定義されていないフィールドについて、現在の日付と時刻の情報を DateTime に追加しないように指定するコード例を次に示します。

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = new CultureInfo("de-DE")
      Dim MyString As String = "12 Juni 2008"
      Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo, _
                                   DateTimeStyles.NoCurrentDateDefault)
      Console.WriteLine(MyDateTime)
   End Sub
End Module
' The example displays the following output if the current culture is en-US:
'       6/12/2008 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo MyCultureInfo = new CultureInfo("de-DE");
      string MyString = "12 Juni 2008";
      DateTime MyDateTime = 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 12:00:00 AM

ParseExact

DateTime.ParseExact メソッドは、指定した文字列パターンに準拠する文字列を DateTime オブジェクトに変換します。 指定された書式に従っていない文字列をこのメソッドに渡すと、FormatException がスローされます。 標準の日付と時刻書式指定子のいずれかを指定するか、またはカスタムの日付と時刻書式指定子の限定された組み合わせを指定できます。 カスタムの書式指定子を使用すると、カスタムの認識文字列を生成できます。 指定子の説明については、標準の日時書式指定文字列およびカスタム日時書式指定文字列に関するトピックを参照してください。

ParseExact メソッドの各オーバーロードは、IFormatProvider パラメーターも受け取ります。このパラメーターは、通常、文字列の書式に関するカルチャ固有の情報を指定します。 多くの場合、この IFormatProvider オブジェクトは、標準のカルチャを表す CultureInfo オブジェクトか、または CultureInfo.DateTimeFormat プロパティによって返される DateTimeFormatInfo オブジェクトです。 ただし、日付と時刻を解析する他の関数とは異なり、このメソッドは標準以外の日付と時刻の形式を定義する IFormatProvider もサポートします。

次のコード例では、解析する文字列オブジェクト、書式指定子、および CultureInfo オブジェクトを ParseExact メソッドに渡しています。 この ParseExact メソッドは、en-US カルチャの Long Date パターンを表す文字列だけを解析できます。

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim MyCultureInfo As CultureInfo = 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
   End Sub
End Module
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 12:00:00 AM
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      CultureInfo MyCultureInfo = new CultureInfo("en-US");
      string[] MyString = {" Friday, April 10, 2009", "Friday, April 10, 2009"};
      foreach (string dateString in MyString)
      {
         try {
            DateTime MyDateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo);
            Console.WriteLine(MyDateTime);
         }
         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 12:00:00 AM

参照

概念

型の書式設定

.NET Framework における型変換

その他の技術情報

文字列の解析