.NET での日付と時刻文字列の解析Parsing Date and Time Strings in .NET

文字列を解析して DateTime オブジェクトに変換するには、日付と時刻がテキストとしてどのように表現されるのかを指定する必要があります。Parsing strings to convert them to DateTime objects requires you to specify information about how the dates and times are represented as text. 異なるカルチャでは、日、月、年の並び順が異なります。Different cultures use different orders for day, month, and year. 24 時間制を使用する時間表記があり、また "AM" および "PM" を指定する時間表記もあります。Some time representations use a 24-hour clock, others specify "AM" and "PM." 一部のアプリケーションは日付のみを必要とします。Some applications need only the date. 時刻のみを必要とするアプリケーションもあります。Others need only the time. 日付と時刻の両方を指定する必要があるアプリケーションもあります。Still others need to specify both the date and the time. 文字列を DateTime オブジェクトに変換するメソッドを使用すると、想定する書式、およびアプリケーションに必要な日付と時刻の要素について、詳しく指定できます。The methods that convert strings to DateTime objects enable you to provide detailed information about the formats you expect and the elements of a date and time your application needs. テキストを正しく DateTime に変換するには、3 つのサブタスクが必要です。There are three subtasks to correctly converting text into a DateTime:

  1. 日付と時刻を表すテキストについて、どのような書式を想定するのか指定する必要があります。You must specify the expected format of the text representing a date and time.
  2. 日時の書式に対してカルチャを指定する場合があります。You may specify the culture for the format of a date time.
  3. テキストの表現で不足している構成要素を、日付と時刻でどのように設定するのか指定する場合があります。You may specify how missing components in the text representation are set in the date and time.

Parse メソッドと TryParse メソッドでは、多くの一般的な日付と時刻の表現を変換します。The Parse and TryParse methods convert many common representations of a date and time. ParseExact メソッドと TryParseExact メソッドでは、日付と時刻の書式指定文字列で指定されたパターンに適合する文字列形式を変換します。The ParseExact and TryParseExact methods convert a string representation that conforms to the pattern specified by a date and time format string. (詳細については、「標準の日時書式指定文字列」および「カスタム日時書式指定文字列」の記事をご覧ください。)(See the articles on standard date and time format strings and custom date and time format strings for details.)

現在の DateTimeFormatInfo オブジェクトでは、テキストを日付と時刻として解釈する方法について、より細かく制御できます。The current DateTimeFormatInfo object provides more control over how text should be interpreted as a date and time. DateTimeFormatInfo のプロパティでは、日付と時刻の区切り記号、月、日、時代 (年号) の名前、"AM" および "PM" を指定する書式について記述します。Properties of a DateTimeFormatInfo describe the date and time separators, and the names of months, days, and eras, and the format for the "AM" and "PM" designations. 現在のスレッド カルチャでは、現在のカルチャを表す DateTimeFormatInfo が提供されます。The current thread culture provides a DateTimeFormatInfo that represents the current culture. 特定のカルチャまたはカスタム設定が必要な場合は、解析メソッドの IFormatProvider パラメーターを指定します。If you want a specific culture or custom settings, you specify the IFormatProvider parameter of a parsing method. IFormatProvider パラメーターには、カルチャを表す CultureInfo オブジェクト、または DateTimeFormatInfo オブジェクトを指定します。For the IFormatProvider parameter, specify a CultureInfo object, which represents a culture, or a DateTimeFormatInfo object.

日付や時刻を表すテキストでは、一部の情報が不足している場合があります。The text representing a date or time may be missing some information. たとえば、ほとんどの人は、「3 月 12 日」という日付が今年の日付を表していると仮定するでしょう。For example, most people would assume the date "March 12" represents the current year. 同様に、"2018年 3 月" は 2018 年の 3 月を表します。Similarly, "March 2018" represents the month of March in the year 2018. 多くの場合、時刻を表すテキストでは、時間、分、AM/PM の指定のみが含まれます。Text representing time often does only includes hours, minutes, and an AM/PM designation. 解析メソッドでは、適切な既定値を使用して、この情報の不足が処理されます。Parsing methods handle this missing information by using reasonable defaults:

  • 時刻のみが存在する場合、日付には現在の日付が使用されます。When only the time is present, the date portion uses the current date.
  • 日付のみが存在する場合、時刻には午前 0 時が使用されます。When only the date is present, the time portion is midnight.
  • 日付で年が指定されていない場合、現在の年が使用されます。When the year isn't specified in a date, the current year is used.
  • 月の日付が指定されていない場合、月の最初の日付が使用されます。When the day of the month isn't specified, the first of the month is used.

文字列内に日付が存在する場合、それには月、および日または年のいずれかが含まれている必要があります。If the date is present in the string, it must include the month and one of the day or year. 時刻が存在する場合、それには時間、および分または AM/PM 指定子のいずれかが含まれている必要があります。If the time is present, it must include the hour, and either the minutes or the AM/PM designator.

NoCurrentDateDefault 定数を指定して、各既定値をオーバーライドできます。You can specify the NoCurrentDateDefault constant to override these defaults. この定数を使用する場合、不足しているすべての年、月、または日のプロパティは値 1 に設定されます。When you use that constant, any missing year, month, or day properties are set to the value 1. Parse を使用する最後の例では、この動作について説明しています。The last example using Parse demonstrates this behavior.

日付と時刻のコンポーネントだけでなく、日付と時刻の文字列形式には、世界協定時刻 (UTC) と何時間異なるかを示すオフセットを含めることができます。In addition to a date and a time component, the string representation of a date and time can include an offset that indicates how much the time differs from Coordinated Universal Time (UTC). たとえば、文字列 "2/14/2007 5:32:00 -7:00" は、UTC より 7 時間早い時刻を定義します。For example, the string "2/14/2007 5:32:00 -7:00" defines a time that is seven hours earlier than UTC. オフセットが時刻の文字列形式から省略される場合、解析では、その Kind プロパティに DateTimeKind.Unspecified を設定して、DateTime オブジェクトを返します。If an offset is omitted from the string representation of a time, parsing returns a DateTime object with its Kind property set to DateTimeKind.Unspecified. オフセットが指定されている場合、解析では、その Kind プロパティに DateTimeKind.Local を設定した DateTime オブジェクトと、使用しているマシンのローカル タイム ゾーンに調整された値を返します。If an offset is specified, parsing returns a DateTime object with its Kind property set to DateTimeKind.Local and its value adjusted to the local time zone of your machine. 解析メソッドで DateTimeStyles 値を使用することで、この動作を変更できます。You can modify this behavior by using a DateTimeStyles value with the parsing method.

書式プロバイダーは、あいまいな数値の日付を解釈するためにも使用されます。The format provider is also used to interpret an ambiguous numeric date. 文字列 "02/03/04" で表される日付は、どの構成要素が月、日、年なのかはっきりしません。It is not clear which components of the date represented by the string "02/03/04" are the month, day, and year. 構成要素は、書式プロバイダーにある類似した日付書式と同じ順序で解釈されます。The components are interpreted according to the order of similar date formats in the format provider.

ParseParse

DateTime.Parse メソッドを使用して stringDateTime に変換する方法の例を次に示します。The following example illustrates the use of the DateTime.Parse method to convert a string into a DateTime. この例では、現在のスレッドに関連付けられているカルチャを使用します。This example uses the culture associated with the current thread. 現在のカルチャに関連付けられている CultureInfo で入力文字列を解析できない場合、FormatException がスローされます。If the CultureInfo associated with the current culture cannot parse the input string, a FormatException is thrown.

ヒント

この記事にあるすべての C# サンプルは、ブラウザーで実行できます。All the C# samples in this article run in your browser. 出力を確認するには、[実行] ボタンを押します。Press the Run button to see the output. また、サンプルを編集して自分で実験することもできます。You can also edit them to experiment yourself.

注意

これらの例は、C#VB 両方の GitHub ドキュメント リポジトリで使用可能です。These examples are available in the GitHub docs repo for both C# and VB. または、C# または VB の Zip ファイルとしてプロジェクトをダウンロードできます。Or you can download the project as a zipfile for C# or VB.

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

文字列を解析するときに使用される書式規則を含むカルチャを、明示的に定義することもできます。You can also explicitly define the culture whose formatting conventions are used when you parse a string. CultureInfo.DateTimeFormat プロパティによって返される標準 DateTimeFormatInfo オブジェクトのいずれかを指定します。You specify one of the standard DateTimeFormatInfo objects returned by the CultureInfo.DateTimeFormat property. 次の例では、書式プロバイダーを使用して、ドイツ語の文字列を DateTime に解析します。The following example uses a format provider to parse a German string into a DateTime. これにより、de-DE カルチャを表す CultureInfo が作成されます。It creates a CultureInfo representing the de-DE culture. この CultureInfo オブジェクトによって、この特定の文字列が正常に解析されます。That CultureInfo object ensures successful parsing of this particular string. これによって、CurrentThreadCurrentCulture がどのように設定されていても除外されます。This precludes whatever setting is in the CurrentCulture of the CurrentThread.

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
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)
' The example displays the following output:
'       6/12/2008 12:00:00 AM

ただし、Parse メソッドのオーバーロードを使用してカスタム書式プロバイダーを指定することはできますが、このメソッドでは非標準の書式の解析はサポートされません。However, although you can use overloads of the Parse method to specify custom format providers, the method does not support parsing non-standard formats. 非標準の書式設定で示された日付と時刻を解析するには、代わりに ParseExact メソッドを使用します。To parse a date and time expressed in a non-standard format, use the ParseExact method instead.

次の例では、DateTimeStyles 列挙体を使用して、未指定のフィールドの DateTime に現在の日付と時刻の情報を追加しないことを指定します。The following example uses the DateTimeStyles enumeration to specify that the current date and time information should not be added to the DateTime for unspecified fields.

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
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)
' The example displays the following output if the current culture is en-US:
'       6/12/2008 12:00:00 AM

ParseExactParseExact

DateTime.ParseExact メソッドでは、文字列が指定された文字列パターンのいずれかに準拠する場合、文字列を DateTime オブジェクトに変換します。The DateTime.ParseExact method converts a string to a DateTime object if it conforms to one of the specified string patterns. 指定された形式のいずれでもない文字列がこのメソッドに渡された場合、FormatException がスローされます。When a string that is not one of the forms specified is passed to this method, a FormatException is thrown. 標準の日付と時刻の書式指定子のいずれか、またはカスタムの書式指定子の組み合わせを指定することができます。You can specify one of the standard date and time format specifiers or a combination of the custom format specifiers. カスタムの書式指定子を使用すると、カスタムの認識文字列を構成することができます。Using the custom format specifiers, it is possible for you to construct a custom recognition string. (指定子の詳細については、標準の日付と時刻の書式指定文字列カスタムの日付と時刻の書式指定文字列に関するトピックをご覧ください)。For an explanation of the specifiers, see the topics on standard date and time format strings and custom date and time format strings.

次の例では、DateTime.ParseExact メソッドに、解析する文字列オブジェクト、書式指定子、CultureInfo オブジェクトが順に渡されます。In the following example, the DateTime.ParseExact method is passed a string object to parse, followed by a format specifier, followed by a CultureInfo object. この ParseExact メソッドでは、en-US カルチャの長い日付パターンに従う文字列のみを解析できます。This ParseExact method can only parse strings that follow the long date pattern in the en-US culture.

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
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
' The example displays the following output:
'       Unable to parse ' Friday, April 10, 2009'
'       4/10/2009 12:00:00 AM

Parse メソッドと ParseExact メソッドの各オーバーロードには、IFormatProvider パラメーターもあります。このパラメーターでは、文字列の書式設定に関するカルチャ固有の情報が指定されます。Each overload of the Parse and ParseExact methods also has an IFormatProvider parameter that provides culture-specific information about the formatting of the string. この IFormatProvider オブジェクトは、標準的なカルチャを表す CultureInfo オブジェクトか、CultureInfo.DateTimeFormat プロパティによって返される DateTimeFormatInfo オブジェクトです。This IFormatProvider object is a CultureInfo object that represents a standard culture or a DateTimeFormatInfo object that is returned by the CultureInfo.DateTimeFormat property. ParseExact では、日付と時刻のカスタム書式を 1 つ以上定義する、文字列または文字列配列の追加の引数も使用されます。ParseExact also uses an additional string or string array argument that defines one or more custom date and time formats.

関連項目See also