文字列を解析して DateTime オブジェクトに変換するには、日付と時刻をテキストとして表す方法に関する情報を指定する必要があります。 カルチャによって、日、月、年ごとに異なる順序が使用されます。 時刻表現の中には 24 時間制を使用するものもあれば、"AM" と "PM" を指定するものもあります。一部のアプリケーションでは、日付のみが必要です。 他のユーザーは時間のみを必要とします。 それでも、他のユーザーは日付と時刻の両方を指定する必要があります。 文字列を DateTime オブジェクトに変換するメソッドを使用すると、予想される形式と、アプリケーションで必要な日付と時刻の要素に関する詳細情報を提供できます。 テキストを DateTimeに正しく変換するには、次の 3 つのサブタスクがあります。
- 日付と時刻を表すテキストの形式を指定する必要があります。
- 日付時刻のフォーマットに使用するカルチャを指定できます。
- テキスト表現の不足しているコンポーネントを日付と時刻で設定する方法を指定できます。
ParseメソッドとTryParseメソッドは、日付と時刻の多くの一般的な表現を変換します。 ParseExactメソッドと TryParseExact メソッドは、日付と時刻の書式指定文字列で指定されたパターンに準拠する文字列表現を変換します。 詳細については、 標準の日時書式指定文字列とカスタム日時書式指定文字列 に関する記事を参照 してください。
現在の DateTimeFormatInfo オブジェクトでは、テキストを日付と時刻として解釈する方法をより詳細に制御できます。 DateTimeFormatInfoのプロパティは、日付と時刻の区切り記号、月、日、および時代 (年号) の名前、および "AM" および "PM" の指定の形式を表します。 CultureInfoによって返されるCultureInfo.CurrentCultureには、現在のカルチャを表すCultureInfo.DateTimeFormat プロパティがあります。 特定のカルチャまたはカスタム設定が必要な場合は、解析メソッドの IFormatProvider パラメーターを指定します。 IFormatProvider パラメーターには、カルチャまたはCultureInfo オブジェクトを表すDateTimeFormatInfo オブジェクトを指定します。
日付または時刻を表すテキストに情報が不足している可能性があります。 たとえば、ほとんどの人は、"3 月 12 日" が現在の年を表すと仮定します。 同様に、"March 2018" は 2018 年の 3 月を表します。 多くの場合、時間を表すテキストには、時間、分、AM/PM の指定のみが含まれます。 解析メソッドは、適切な既定値を使用して、この不足している情報を処理します。
- 時刻のみが存在する場合、日付部分は現在の日付を使用します。
- 日付のみが存在する場合、時刻部分は午前 0 時です。
- 日付に年が指定されていない場合は、現在の年が使用されます。
- 月の日が指定されていない場合は、その月の最初の日が使用されます。
日付が文字列内に存在する場合は、月と日または年のいずれかを含める必要があります。 時刻が存在する場合は、時間と、分または AM/PM 指定子を含める必要があります。
NoCurrentDateDefault定数を指定して、これらの既定値をオーバーライドできます。 この定数を使用すると、不足している年、月、または日のプロパティは、 1値に設定されます。
を使用したParseでは、この動作を示します。
日付と時刻のコンポーネントに加えて、日付と時刻の文字列形式には、協定世界時 (UTC) と時刻の違いを示すオフセットを含めることができます。 たとえば、文字列 "2/14/2007 5:32:00 -7:00" は UTC より 7 時間前の時刻を定義します。 時刻の文字列形式からオフセットを省略した場合、解析では、DateTime プロパティが Kind に設定されたDateTimeKind.Unspecified オブジェクトが返されます。 オフセットが指定されている場合、解析では、DateTime プロパティが Kind に設定されたDateTimeKind.Local オブジェクトが返されます。 その値は、コンピューターのローカル タイム ゾーンにも調整されます。 この動作は、解析メソッドで DateTimeStyles 値を使用して変更できます。
書式プロバイダーは、あいまいな数値日付を解釈するためにも使用されます。 文字列 "02/03/04" で表される日付のどのコンポーネントが月、日、年かは不明です。 コンポーネントは、形式プロバイダーの類似した日付形式の順序に従って解釈されます。
Parse
次の例は、 DateTime.Parse メソッドを使用して string を DateTimeに変換する方法を示しています。 この例では、現在のスレッドに関連付けられているカルチャを使用します。 現在のカルチャに関連付けられている CultureInfo が入力文字列を解析できない場合は、 FormatException がスローされます。
注
これらの例は、 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
文字列を解析するときに書式設定規則が使用されるカルチャを明示的に定義することもできます。
DateTimeFormatInfo プロパティによって返される標準CultureInfo.DateTimeFormat オブジェクトのいずれかを指定します。 次の例では、書式プロバイダーを使用して、ドイツ語の文字列を DateTimeに解析します。
CultureInfo 文化を表すde-DEを作成します。 その CultureInfo オブジェクトにより、この特定の文字列が正常に解析されます。 このプロセスでは、CurrentCultureのCurrentThreadに含まれる設定は除外されます。
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 がスローされます。 標準の日時書式指定子の 1 つ、またはカスタム書式指定子の組み合わせを指定できます。 カスタム書式指定子を使用すると、カスタム認識文字列を作成できます。 指定子の説明については、標準の日時書式指定文字列とカスタム日時書式指定文字列に関する記事を参照してください。
次の例では、 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 '{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 プロパティによって返される標準カルチャまたはDateTimeFormatInfo オブジェクトを表すCultureInfo.DateTimeFormat オブジェクトです。 ParseExact では、1 つ以上のカスタム日時形式を定義する追加の文字列または文字列配列引数も使用されます。
こちらも参照ください
.NET