88

私はDateTimeOffset、どのタイムゾーンでも特定の瞬間を伝えるために使用しようとしています。TimeZoneInfo夏時間に対処するために使用する方法がわかりません。

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));

これは出力します:

2010/6/2 16:37:19
2010/6/2 午後 3:37:19 -06:00

私は中央時間帯にいて、現在は夏時間です。2行目を読み取ろうとしています:

2010/6/2 午後 4:37:19 -05:00

BaseUtcOffsetDSTに基づいて変更されないようです。

適切なオフセット値で適切な時間を取得するにはどうすればよいですか?

4

5 に答える 5

72

TimeZoneInfo から UtcOffset を取得し、それを ToOffset() メソッドに渡す必要があります。

var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());

var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
于 2010-06-02T22:15:33.847 に答える
12

または、タイムゾーン識別子をハードコードしたくない場合は、次のようにします。

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
于 2015-03-11T19:53:18.787 に答える
0

これにより、自動的に調整されます...そして、タイムゾーンごとに戻ります。

public static string SetLastModified (

TimeZoneInfo csttzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZone.CurrentTimeZone.StandardName);

DateTime cstTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, csttzi);

return String.Format("DaylightSavingTime: {0}", cstTime.IsDaylightSavingTime().ToString());

}

于 2022-02-17T20:56:25.057 に答える