2017-02-22 5 views
3

私は、UTCの日付をISO 8601の文字列に変換してWeb api経由で送信する場合があります。これを行うための推奨される方法はとても似のTimeZoneInfoを使用することです:これは私のローカルマシン上で正常に動作しますC#DateTime.ToString "o"形式でAzureに異なる文字列を返します

var configuredTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneString); 
var localTime = DateTime.SpecifyKind(TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone), DateTimeKind.Local); 
var stringResult = localTime.ToString("o"); 

が、私は、ToStringメソッドは、コードがでホストされている別の文字列を出力非常に奇妙な状況に実行していますよAzureウェブアプリ。地方で私は2017-02-20T00:00:00-06:00(これは私が必要とするタイムゾーン情報を含んでいるので、私が欲しいものです)ですが、Azureでホストされると2017-02-20T00:00:00 + 00:00。(これはUTCで、私が欲しいものではない)。私が手動でタイムゾーンを適用しているので、フォーマットが間違ったタイムゾーン情報を追加している理由がわかりません。誰もこれに前に遭遇しましたか?

+0

'DateTime'はタイムゾーンを保存できません。 – SLaks

+3

、Azureの* local *タイムゾーンはUTCです。 –

+0

私は手動でTimeZoneInfo.ConvertTimeFromUtcを介して必要なタイムゾーンを提供しています。だから、AzureのUTCを使用して変換がどうなるのでしょうか? –

答えて

3

コメントに記載されているように、System.DateTimeはタイムゾーンを保存できません。それが知っているのは "ローカル"または "UTC"だけです。 Azureでホストされているので、そのローカル時間 UTCです。

だから、TimeZoneInfo.ConvertTimeFromUtc(utcTime, configuredTimeZone)のあなたの文では、あなたの時間(20日の深夜)をするUTC時刻を変換するだろうが、DateTimeは何のタイムゾーンを保持していないので、それはDateTimeKind.Unspecifiedです。 DateTime.SpecifyKind(..., DateTimeKind.Local)は単に「ローカル」タイプであり、Azureホストの場合はUTC + 00:00であることを伝えます。

タイムゾーンが重要な場合は、DateTimeの代わりにSystem.DateTimeOffsetを使用します。これは具体的には、タイムゾーンオフセットを(その名前が示すように)保持して操作するために構築されています。

関連する問題