世界協定時刻(回答)

答え

  • A

bool validDate = DateTime.TryParse(inputDate, CultureInfo.CurrentCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal, out validatedDate);

解説

A

bool validDate = DateTime.TryParse(inputDate, CultureInfo.CurrentCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal, out validatedDate);

A.は、DateTimeStylesのうち、DateTimeStyles.AdjustToUniversalDateTimeStyles.AssumeLocal|を使って設定されています。

DateTimeStyles.AdjustToUniversalでは、日時を世界協定時刻(UTC)で返します。

また、入力文字列がタイムゾーン指定子または AssumeLocal で現地時刻を示す場合には、日付と時刻は現地時刻から UTC に変換されます。

DateTimeStyles.AssumeLocalは、解析された文字列でタイム ゾーンが指定されていない場合、その文字列は現地時間を示すものと見なされます。

また、TryParseメソッドを使うことでフォーマットが正しくない場合にも例外エラーは発生しません。

B

bool validDate = DateTime.TryParse(inputDate, CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal, out validatedDate);

B.は、DateTimeStylesのうち、DateTimeStyles.AssumeUniversalが設定されています。

これは、解析された文字列でタイムゾーンが指定されていない場合には、その文字列はUTCを示すものとしてみなされます。

これでは、「ユーザーは、ローカル・フォーマットに従った日付を入力します。」と「入力された日付を検証し、世界協定時刻(UTC)に変換する必要があります。」の条件を満たさず、正しい結果が取得できません。

実際に、「2019年02月15日 18時12分」を変換させた場合、結果は「2019年02月16日 03時12分」が返されます。

C

bool validDate = true;
try {
validatedDate = DateTime.Parse(inputDate);
} catch {
validDate = false;
}

C.は、「入力された日付を検証し、世界協定時刻(UTC)に変換する必要があります。」の条件を満たしません。

また、このコードではParseメソッドにフォーマットが正しくない値を渡した場合に例外エラーが発生します。

そのため、try-catchを用いることでvalidDateに変換結果を格納しています。

しかし、このように例外エラーを無意味に握りつぶさなくても、TryParseメソッドを使うことで簡単に実現することが可能です。

実際に、「2019年02月15日 18時12分」を変換させた場合、結果は「2019年02月15日 18時12分」が返されます。

D

validatedDate = DateTime.ParseExact(inputDate, "g", CultureInfo.CurrentCulture , DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);

D.は、指定されたフォーマットと完全に一致する必要があるため、フォーマット以外を指定するとSystem.FormatExceptionエラーが発生します。

また、DateTimeStylesのうち、DateTimeStyles.AssumeUniversalが設定されています。

これは、解析された文字列でタイムゾーンが指定されていない場合には、その文字列はUTCを示すものとしてみなされます。

このため、「入力された日付を検証し、世界協定時刻(UTC)に変換する必要があります。」の条件を満たしません。

実際に、「2019年02月15日 18時12分」を変換させた場合、System.FormatExceptionエラーが発生します。

参考