C#で文字列を日付型(DateTime)へ変換する

C#では日付を管理する為のDateTime構造体があります。

ここでは文字列からDateTimeへ変換する方法について解説します。

 

DateTime.Parseメソッド

DateTime.Parseメソッドは、1番目の引数で指定した文字列をDateTimeへ変換します。

変換できないような文字列が渡された場合は例外が発生します。

            try
            {
                DateTime dt1 = DateTime.Parse("2020/1/23 13:20:10");
                DateTime dt2 = DateTime.Parse("2020/1/23");           //時間が省略された時は0:00:00で変換
                DateTime dt3 = DateTime.Parse("13:20:10");            //日付が省略された時は現在の日で変換
                DateTime dt4 = DateTime.Parse("令和2年1月23日");      //和暦でもOK
            }
            catch (ArgumentNullException e)
            {
                //引数がnullの場合はココに来る
            }
            catch (FormatException e)
            {
                //引数が変換できない場合はココに来る
            }

DateTime.TryParseメソッド

DateTime.TryParseメソッドは、1番目の引数で指定した文字列をDateTimeへ変換し、変換結果を参照渡しした引数で受け取ります。

戻り値には変換できたかどうかを bool型の値で受け取る事が出来ます。

            DateTime dt;
            if (DateTime.TryParse("2020/1/1 13:20:10", out dt))
            {
                //引数が変換できた場合はココに来る
                Console.WriteLine(dt);
            }
            else
            {
                //引数が変換できない場合はココに来る
            }

タイムゾーン

DateTimeには時刻の種類を表す Kind プロパティがあります。

 

Kindプロパティの値は以下の3種類です。

  • Unspecified ・・・ 現地時刻でも世界協定時刻(UTC)でもない
  • Local    ・・・ 現地時刻であることを表す
  • Utc     ・・・ 世界協定時刻(UTC)であることを表す

 

普通に変換した場合(第2,3引数を省略した場合)

普通に変換した場合 Kind プロパティには Unspecofied が設定されます。

但し、変換する文字列にタイムゾーンを表す文字が含まれる場合は Local になります。

var dt1 = DateTime.Parse("2020/01/23 10:00:00");    // Unspecofied の 2020/1/23 10:00:00
var dt2 = DateTime.Parse("2020-01-23T10:00+3:00");  // Local(日本) の 2020/1/23 16:00:00

※LocalはOSのタイムゾーンを基準にした時刻

※2行目の"2020-01-23T10:00+3:00"はUTCの"07:00"になる

※OSのタイムゾーンが日本の場合"16:00"になる(日本は+9:00)

現地時間で管理したい場合

第3引数に「System.Globalization.DateTimeStyles.AssumeLocal」を指定すると Kind プロパティを Local にした値にする事が出来ます。

var style = DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal;
var dt1 = DateTime.Parse("2020/01/23 10:00:00", null, style);    // Local(日本) の 2020/1/23 10:00:00
var dt2 = DateTime.Parse("2020-01-23T10:00+3:00", null, style);  // Local(日本) の 2020/1/23 16:00:00

世界協定時刻(UTC)で管理したい場合

第3引数に

System.Globalization.DateTimeStyles.AdjustToUniversal」と「System.Globalization.DateTimeStyles.AssumeUniversal」を

指定すると Kind プロパティを Utc にした値にする事が出来ます。

var style = DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal;
var dt1 = DateTime.Parse("2020/01/23 10:00:00", null, style);    // Utc の 2020/1/23 10:00:00
var dt2 = DateTime.Parse("2020-01-23T10:00+3:00", null, style);  // Utc の 2020/1/23 07:00:00

 

関連記事