サマータイムなんてやめてほしいけど、ちょっと気になるので調べてみたら、C#のDateTimeにKindというプロパティがあることに今更ながら気がついた。
DateTime::Kind プロパティ
DateTimeKind 列挙型で、
メンバー名 | 内容 |
---|---|
Local | ローカル時刻 |
Utc | UTC |
Unspecified | 不明 |
のいずれかの値を持つ。
初期値は、Unspecified
DateTime datetime1 = new DateTime(2018, 1, 1, 0, 0, 0);
DateTime datetime2 = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Local);
DateTime datetime3 = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc);
Console.WriteLine(datetime1.Kind.ToString());
Console.WriteLine(datetime2.Kind.ToString());
Console.WriteLine(datetime3.Kind.ToString());
Console.WriteLine(datetime1.ToString("yyyy-MM-dd HH:mm:ss K"));
Console.WriteLine(datetime2.ToString("yyyy-MM-dd HH:mm:ss K"));
Console.WriteLine(datetime3.ToString("yyyy-MM-dd HH:mm:ss K"));
この結果は、
Unspecified
Local
Utc
2018-01-01 00:00:00
2018-01-01 00:00:00 +09:00
2018-01-01 00:00:00 Z
となる。
ここで、datetime2
とdatetime3
でTimeSpanを出したらどうなるのかな?
Console.WriteLine((datetime2-datetime3).TotalHours.ToString());
Console.WriteLine(datetime2 == datetime3);
この結果は、
0
True
となる。
TimeSpanや比較ではDateTimeのKindは関係なしということなのかな。
じゃ、DateTimeのKindってどういう使い方をするのか?
DateTimeが表す日時が現地時刻かUTCかを設定する
Kindプロパティの値によって違いが出るのは、DateTimeを別のタイムゾーンの日時に変換する時です。DateTimeの計算や比較には影響を与えません。
とあるので、ひとつのタイムゾーンのみを考えればいいような場合は気にしなくてもいいのかな。
まぁ、それでもKindはLocalにしておくのが良さそうな気はする。
.NET2.0 SP1からDateTimeOffsetという型が追加になっているみたいで、UTC+オフセット時間を持っているらしい。
こっちのほうがサマータイムでは有効なのかな?とも思ったけど、
DateTimeの代わりにDateTimeOffsetを使用する
ただし、DateTimeOffsetはUTCとの時差を保持しているだけで、タイムゾーンの情報は持っていませんので、サマータイムのように特定の時期だけ時差が変わってしまうケースにまでは対応していません。
とあるので、例えばOSのアップデートでサマータイム対応されたとしてもDateTimeOffsetではダメということかな。
前に、データベースのTIMESTAMP WITH TIME ZONE
型を値をC#でやり取りするときにはDateTimeOffsetを使うんじゃないのかな?と思って確認したときも、TIMESTAMP WITH TIME ZONE
型もTIMESTAMP WITHOUT TIME ZONE
型もDateTime型で扱うということだったけど、じゃそのときのDateTimeのKindはそれぞれどうなっていたのか?これは確認する必要がありそう。