LoginSignup
1
0

More than 5 years have passed since last update.

C#のDateTimeのKindについて

Posted at

サマータイムなんてやめてほしいけど、ちょっと気になるので調べてみたら、C#のDateTimeにKindというプロパティがあることに今更ながら気がついた。

DateTime::Kind プロパティ
DateTimeKind 列挙型で、

メンバー名 内容
Local ローカル時刻
Utc UTC
Unspecified 不明

のいずれかの値を持つ。
初期値は、Unspecified

DateTime.Kind
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"));

この結果は、

Result
Unspecified
Local
Utc
2018-01-01 00:00:00
2018-01-01 00:00:00 +09:00
2018-01-01 00:00:00 Z

となる。
ここで、datetime2datetime3でTimeSpanを出したらどうなるのかな?

TimeSpan
Console.WriteLine((datetime2-datetime3).TotalHours.ToString());
Console.WriteLine(datetime2 == datetime3);

この結果は、

Result
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はそれぞれどうなっていたのか?これは確認する必要がありそう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0