4

XPおよびWindows7で次のことを行うと、.NET4コンソールアプリケーションと.NET2コンソールアプリケーションで異なる結果が得られます。

Console.WriteLine(String.Format("DateTime.Parse on Client: {0}", 
   DateTime.Parse("1998-10-31T00:00:00-04:00")));

.NET4
XPではこれは次のようになります: 10/31/1998 12:00:00 AM
Windows 7 / Windows 8ではこれは次のようになります: 10/30/1998 11:00:00 PM

.NET2
XPの場合、これは次のようになります: 10/31/1998 12:00:00 AM
Windows 7 / Windows 8の場合、これは次のようになります: 10/31/1998 12:00:00 AM

どうして??!?

文字列からTimeZone(-04:00)を削除すると、.NET4のXPとWindows7の両方で値が同じになります。Windows XPは、文字列からDateTime.Parseを実行するときに、.NET4でタイムゾーンオフセットを異なる方法で適用するようです。この動作を変更して、.NET4で一貫性を保ち、OSに依存しないようにする方法はありますか(DateTime.Parseに送信される文字列を操作する必要はありません)。

環境: すべてのマシンに最新のパッチがインストールされており(Windows Updateから入手可能)、[タイムゾーン設定]で[夏時間の時計を自動的に調整する]がオンになっている東部時間に構成されています。

.NET4を搭載したWindows7マシンと.NET4.5を搭載したWindows7マシンの両方でこの動作を確認しました

4

3 に答える 3

5

過去の日付の現地時間を計算するには、.NETがその日付の間に有効だった夏時間のルールを知っている必要があります。もちろん、DSTの規則は地域や日付によって大きく異なるため、これはかなり難しい作業です。

日付のUTCオフセットは-4であり、米国の東部タイムゾーンに近い場所にあります。最も関連性の高いDST規則の変更は、DSTの有効期間を3月の第2日曜日から2007年の第1日曜日に延長した2005年のエネルギー政策法でした。したがって、1998年10月31日の現地時間を知るにはこの法律がまだ施行されていないことを知っています。

そして、そこから違いが生まれます。Windows Vistaは、これらのDST変更のデータベースを備えた最初のWindowsバージョンであり、.NET4はそれを使用し始めた最初の.NETバージョンでした。XPにはそのデータベースがないため、.NETは現在のDSTルールが有効であると想定する以外に何もできません。

これは、現地時間で作業するときに対処する必要のある避けられない損失です。UTCを使用しないでください。

于 2013-01-10T16:33:22.253 に答える
1

DateTime値は任意のオフセットを表すことはできません。プロパティのみを追跡し.Kindます。プロパティはUTC、、、LocalまたはUnspecifiedです。

オフセットのない文字列を。に解析するDateTimeと、種類は。になりますUnspecified

オフセットのある文字列解析するDateTimeと、種類が変わり、指定したオフセットとローカルタイムゾーンから決定されたオフセットLocal基づいて時間が調整されます。

したがって1998-10-31T00:00:00-04:00、最初にUTC1998-10-30T20:00:00-00:00に変換されてから、ローカルコンピューターのオフセット(この場合は東部夏時間-05:00)が適用され、現地時間は。になります1998-10-30T23:00:00-05:00

ハンスが彼の回答で説明したように、.Net2.0もWindowsXPも、同じタイムゾーン内の夏時間の時間差を適切に区別できません。したがって、東部では、日付に関係なく、常に-04:00に戻ります。

このナンセンスをすべて回避する最善の方法は、DateTimeOffset代わりに型を使用することです。最初に与えたオフセットを追跡し、必要に応じて変換できます。これは、SP1を使用する.Net 2.0に存在しますが、.Net 3.5以降(4.0を含む)では、TimeZoneInfoクラスを使用して簡単に操作することもできます。

したがって、コードをに変更するDateTimeOffset.Parse("1998-10-31T00:00:00-04:00")と、より良い状態になります。

于 2013-01-21T18:59:41.190 に答える
0

一方のマシンでは環境設定で夏時間がチェックされており、もう一方のマシンではチェックされていないようです。

于 2013-01-10T01:32:53.903 に答える