2

.NET の処理で閏年と思われるものに遭遇しました。DateTime具体的にはToLocalTime(). 問題を再現するコードを次に示します (私は太平洋時間帯にいます)。

DateTime dtStartLocal = DateTime.Parse("2009-02-28T23:00:00.0-08:00");
DateTime dtEndLocal = dtStartLocal.AddYears(3);
DateTime dtStartUtc = dtStartLocal.ToUniversalTime();
DateTime dtEndUtc = dtStartUtc.AddYears(3);
DateTime dtEndLocal2 = dtEndUtc.ToLocalTime();
DateTime dtStartLocal2 = dtStartUtc.ToLocalTime();
Console.WriteLine("START: 1={0}, 2={0}", dtStartLocal, dtStartLocal2);
Console.WriteLine("END  : 1={0}, 2={1}", dtEndLocal, dtEndLocal2);
Console.ReadLine();

出力は次のとおりです。

開始: 1=2009/2/28 午後 11:00:00、2=2009/2/28 午後 11:00:00 終了
: 1=2/28/2012 午後 11:00:00、2=2/29 /2012 午後 11:00:00

私が行った変数がToUniversalTime().AddYears(3).ToLocalTime()単に とは異なることに注意してくださいAddYears(3)。それは 1 日先です。

誰かがこれに遭遇しましたか?これが予想される場合、誰かがその背後にあるロジックを説明できますか?

注: はい、最善の方法は、完全に UTC で動作し、それらの間でフリップフロップしないことです。これは私に影響を与えるものではなく、私が遭遇した特異性です。基本的に、私はどのように機能するかを誤解してAddYears()いましたが、今ではなぜそれが何をしているのかがわかります(以下の選択した回答を参照してください)。

4

3 に答える 3

10

これは正しく機能していると思います。

DateTime dtStartUtc = dtStartLocal.ToUniversalTime();

PSTはUTC-8です。したがって、これは時刻を2009年3月1日07:00:00に変換します。

DateTime dtEndUtc = dtStartUtc.AddYears(3);

これにより、前回に3年が追加され、2012年3月1日07:00:00になります。

DateTime dtEndLocal2 = dtEndUtc.ToLocalTime();

これにより、終了時刻がPSTに変換されます。PSTは2012年2月29日11:00:00になります。

これは、現地時間とUTC時間の間の変換の単なる副作用だと思います。

于 2009-03-02T20:57:53.523 に答える
0

タイムゾーン/補正係数を印刷します。.ToUniversialTime()を実行すると、基本的に元の時刻( "-08:00")から8時間が追加され、2月28日の23:00から翌日の11:00になります。したがって、3年を追加すると、29日の午前11:00になります。2年間やっていたとしたら、3月1日だったでしょう。うるう年とは何の関係もありません。

于 2009-03-02T20:57:05.490 に答える
0

私が知る限り、この動作は正しくありません。現地時間を UTC に変換すると、実質的に翌日にプッシュされます。3月1日。3 年足すと 3 月 1 日のままです。これを現地時間に戻すと、前日 (2012 年はうるう年であるため、2 月 29 日) に戻ります。

于 2009-03-02T21:06:39.943 に答える