0

サンプル シナリオ:

サーバーはタイム ゾーン +13.00 (たとえば) にあり、ユーザーはタイム ゾーン +2.00 で作業しています。

どのように私は引き起こすことができます:

DateTime.Now

UTC +2.00 の時刻を返すためにサーバーで呼び出されましたか? (または、DateTime.Now の結果を +2.00 タイム ゾーンに変換します)

4

2 に答える 2

2

TimeZoneInfo.ConvertTimeメソッドを使用します。DateTimeこれにより、変換する とソース/宛先のタイム ゾーンを渡すことができます。

使用例:

var localTime = DateTime.Now;
try
{
   Console.WriteLine("Local time: {0}", localTime);
   TimeZoneInfo destTz = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
   var pacificTime = TimeZoneInfo.ConvertTime(localTime, TimeZoneInfo.Local, destTz);
   Console.WriteLine("Pacific time: {0}", pacificTime);
}
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The registry does not define the Pacific Standard Time zone.");
}                           
catch (InvalidTimeZoneException)
{
    Console.WriteLine("Registry data on the Pacific Standard Time zone has been corrupted.");
}

ローカル タイム ゾーンを常に変換している場合 (つまり、X タイム ゾーンから Y に変換することを明示的に言っていない場合)、パラメーターを取らない他のTimeZoneInfo.ConvertTimesourceTimeZoneオーバーロードを使用できます。タイムゾーンはDateTime.Kind、ソース日付のプロパティから計算されます (あなたの場合、DateTime.Nowいずれにしてもローカルを意味します)。

于 2012-11-19T09:10:39.533 に答える
1

normalDateTime自体には、タイム ゾーンに関する情報は含まれません。Kind(現地時間または世界時であることがわかっている場合は、ヒントが含まれています。)

サーバーとユーザー間の通信で UTC 時間を使用する可能性を検討してください。送信前は 、.ToUniversalTime()受信後は を使用してください.ToLocalTime()DateTime値に対して算術演算を実行するKindと、保存されない可能性があり、誤って.ToLocalTime()複数回実行するなどのリスクがあることに注意してください。

DateTimeOffset代わりに使用する可能性もあります。日付と時刻とともにタイムゾーンが含まれています。

var nowWithZone = DateTimeOffset.Now;

DateTimeOffsetなどの方法で other に変換できます。nowWithZone.ToLocalTime()nowWithZone.ToOffset(TimeSpan.FromHours(+2.0))

、、 などDateTimeのプロパティを使用して通常に変換できます。nowWithZone.LocalDateTimenowWithZone.UtcDateTimenowWithZone.DateTime

最後に、これが難しすぎたり、ニーズに対して単純すぎる場合は、野田時間を使用する可能性があります。

于 2012-11-19T11:39:50.540 に答える