私の最大の不満の 1 つは、平均的なユーザーが直感的に API で行うと思われることを行わない API です。
事例: .NET のDateTime.ToUniversalTime。ドキュメントは恐ろしいです:
Windows XP システムでは、ToUniversalTime メソッドは、現地時間から UTC への変換時に現在の調整規則のみを認識します。その結果、現在の調整規則が有効になる前の期間の変換は、現地時間と UTC の差を正確に反映しない場合があります。
そして後にこう続けます。
Windows XP システムでは、ToUniversalTime メソッドはローカル タイム ゾーンの現在の調整規則のみを認識し、下位レベルの日付 (つまり、現在の調整規則の開始日より前の日付) を含むすべての日付に適用されます。 . 歴史的に正確なローカル日付と時刻の計算を必要とする Windows XP で実行されているアプリケーションは、FindSystemTimeZoneById メソッドを使用してローカル タイム ゾーンに対応する TimeZoneInfo オブジェクトを取得し、その TimeZoneInfo.ConvertTimeToUtc(DateTime, TimeZoneInfo) メソッドを呼び出すことによって、この動作を回避する必要があります。
これは、これまでに作成されたドキュメンテーションの中で最も愉快な一文に違いありません。ToUniversalTime() を使用するときに、正確なローカル日付と時刻の計算を必要としないのは誰ですか? このメソッドを ObsoleteAttribute でマークしないのはなぜですか?
とにかく、私が探しているのは、[RequiresHistoricallyAccurateLocalDateAndTimeCalculationsAttribute] などのアセンブリ レベルのメタデータでアセンブリをマークできるツールです。次に、ToUniversalTime() のインスタンスが見つかった場合は、コンパイラ エラーとしてフラグを立てます。これは、C# でアンマネージ コードに安全でない注釈がないと直接アクセスできないのと同じ方法です。