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