.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()
いましたが、今ではなぜそれが何をしているのかがわかります(以下の選択した回答を参照してください)。