17

DateTimeを特定のタイムゾーンに変換するためのサポートが必要です。以下にあるものは正しく機能していません。

gmTime=03/02/2013 1:00:00 AM

 TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
 var time = timeZoneInfo.ConvertTime(gmTime, timeZone);

ゾーンが適用されたときの値である、の値をデバッグすると、として返さtimeれます。03/01/2013 8:00:00 PM03/02/2013 1:00:00 AM

そうするとtime.ToLocalTime()、正しい値が得られます。timeただし、別のタイムゾーンに変換する必要があります。

4

2 に答える 2

18

DateTime オブジェクトには「Kind」変数があり、TimeZoneInfo がその処理方法を知るのに役立ちます。TimeZone.ConvertTimeのMSDN ドキュメントには、次のように記載されています。

DateTimeKind.Local、現地時間を destinationTimeZone の時間に変換します。

DateTimeKind.Utc、協定世界時 (UTC) を destinationTimeZone の時刻に変換します。

DateTimeKind.Unspecified、ローカルと見なされます。

例えば:

  Console.WriteLine("Local time zone is '{0}'.", TimeZoneInfo.Local.Id);

  var gmTime          = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Utc);
  var localTime       = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Local);
  var unspecifiedTime = new DateTime(2013, 03, 02, 01, 00, 00);

  var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

  var gmTimeConverted           = TimeZoneInfo.ConvertTime(gmTime,          timeZone); // 03/02/2013 8:00:00AM
  var localTimeConverted        = TimeZoneInfo.ConvertTime(localTime,       timeZone); // 03/02/2013 
  var unspecifiedTimeConverted  = TimeZoneInfo.ConvertTime(unspecifiedTime, timeZone);

  Console.WriteLine("Converting GMT         to EST: {0}", gmTimeConverted);
  Console.WriteLine("Converting Local       to EST: {0}", localTimeConverted);
  Console.WriteLine("Converting Unspecified to EST: {0}", unspecifiedTimeConverted);

結果:

ローカル タイム ゾーンは「太平洋標準時」です。
GMT から EST への変換: 3/1/2013 8:00:00 PM
ローカルから EST への変換: 2013 年 3 月 2 日 4:00:00 AM
Unspecified から EST への変換: 2013 年 3 月 2 日 4:00:00 AM

または、ローカル タイムゾーンが「東部標準時」の場合は、次の結果が得られます

ローカル タイム ゾーンは「東部標準時」です。
GMT から EST への変換: 3/1/2013 8:00:00 PM
ローカルから EST への変換: 2013 年 3 月 2 日 1:00:00 AM
Unspecified から EST への変換: 2013 年 3 月 2 日 1:00:00 AM



TimeZoneInfo で「Unspecified」を Utc のように扱いたい場合は、TimeZoneInfo.ConvertTimeFromUtc のように機能する必要があります。再びMSDNのドキュメントから

DateTimeKind.Local、ArgumentException をスローします。

DateTimeKind.Unspecified または DateTimeKind.Utc、協定世界時 (UTC) から変換します。

于 2013-03-02T15:31:40.260 に答える
8

次のChaceのようなものを試してください

TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone);
于 2013-03-02T01:40:30.893 に答える