modest violet

読者です 読者をやめる 読者になる 読者になる

modest violet

開発者としてのあれこれや、日々の雑記など

your future hasn't written yet. no one's has.
by Emmett Lathrop "Doc" Brown

【Azure】.ToUniversalTime の罠に見事にはまった話

Dev Azure

Azure上における時間は基本的に協定世界時間 (UTC) です。

こんな記事を書いておきながら、未だに慣れない場面も。きっと開発環境がJISだから悪いんだろうけど・・・。
shin21.hatenablog.com

ToUniversalTime で UTCに変換

.NET FrameworkにはUTCに変換する .ToUniversalTime() メソッドがあるので、それを用いる。

開発環境で動かした結果。うんうん問題なし。

f:id:shin21sk:20170117202938p:plain


Azureで動かした結果。全く時間が変わっていませんね。

f:id:shin21sk:20170117202945p:plain

確かに。

UTCUTCに変換しようとしても、そりゃあ同じ値だよな・・・。

Azure上のローカルはUTC何だから、以下略


きっと、疲れていたんだな、うん。

DateAddで +9でもいいんだけど

なんとなく気持ち悪い。しっくりこない。

.NET Framework 3.5以降は TimeZoneInfo.ConvertTimeToUtc

困ったときは DOBON.NET様 ですね。

ローカル時刻を世界協定時刻(UTC)に変換する: .NET Tips: C#, VB.NET

.NET Framework 3.5以降では、ローカル時刻をUTCに変換するのにTimeZoneInfo.ConvertTimeToUtcメソッドを、UTCをローカル時刻に変換するのにTimeZoneInfo.ConvertTimeFromUtcメソッドを使用します。

http://dobon.net/

なるほど、このメソッドを使えば、変換前のタイムゾーンを無理矢理指定できるわけですね。

早速、試してみたソースがコチラ。

System.TimeZoneInfo.ConvertTimeToUtc(new DateTime(2017, 1, 20), System.TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"))


f:id:shin21sk:20170117204836p:plain

グローバルに対応したい場合

変換元のタイムゾーンを利用者毎に保持して、当てはめれば良さそうですね。

TimeZoneInfo.ConvertTimeToUtcメソッド、素晴らしい!