なんとかするから、なんとかなる

エンジニア関係のことを書きます

C# DateTimeにタイムゾーンを考慮するときのまとめ

はじめに

C# においてDateTimeの使い方がわからなかったため調べた際のメモ

kind.unspecifiedの扱い

DateTimeでkindが"unspecfied"のとき

var unspecifiedTime = new ... ; // kind がunspecified

ToLocalTimeをすると、unspecfiedTimeはUTCとして扱われる

unspecifiedTime.ToLocalTime; //  UTC

ToUniversalTimeすると、unspecfiedTimeはシステムのTimeZoneとして扱われる

unspecifiedTime.ToUniversalTime; // システムのタイムゾーン

unspecifiedをUTCに変換する

DBにタイムゾーン情報が無いとき、日時を変換しないでDateTimeKindのみ変換したい場合、DateTime.SpecifyKindメソッドを利用する

var utcTime = DateTime.SPecifyKind(unspecifiedTime, DateTimeKind.Utc); // UTC

TimeZoneInfoの注意点

特定のTimeZoneに変換する場合、TimeZoneInfoが利用できる。 しかし、変換対象のDateTimeのDateTimeKindがunspecifiedの場合、実行時エラーが発生する。 タイムゾーンを指定した上でタイムゾーンを変換する必要がある

TimeZoneInfo jstTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime jstTime = TimeZoneInfo.ConvertTimeFromUtc(utcTime, jstTimeZone);

ある特定の時間差のみ考慮すれば良い

DateTimeOffsetを利用する

参考URL

https://stackoverflow.com/questions/16442484/datetime-unspecified-kind