32

ASP.NET MVC3 コントローラーに次のコードがあります。

public PartialViewResult GetCalendar(int? month, int? year)
    {
        var test = new DateTime((year.HasValue ? year.Value : 1), (month.HasValue ? month.Value : 1), 1);
        return PartialView("Calendar", new DateTimeOffset(test));
    }

私のビューモデルはDateTimeOffset?

スローされた例外の理由は何ですか?

4

4 に答える 4

55

コンストラクターは、最初に「UTC」以外のものを同等の UTC 時間にDateTimeOffset変換します。次に、UTC に相当する値がandの範囲外にあるかどうかをチェックし、範囲外にある場合は、発生しているものと同様のものをスローします。DateTimeKindDateTimeDateTimeOffset.MinValueDateTimeOffset.MaxValueArgumentOutOfRangeException

DateTime.Kind使用している変数の を確認し、testそれが「UTC」でない場合は、UTC への変換によって、DateTime指定された bytestがこれらの範囲外になるかどうかを調べます。MSDN のドキュメントによると、MinValueand MaxValue(UTC) は'1/1/0001 12:00:00 AM +00:00' と '12/31/9999 11:59:59 PM +00:00' です。

ドキュメント(DateTimeOffset.MinValue)は次のことに注意してください。

「メソッドが MinValue との比較を実行する前に、DateTimeOffset 値は協定世界時 (UTC) に変換されます。これは、日付と時刻が最小範囲に近いが、オフセットが正の DateTimeOffset 値は、例外をスローする可能性があることを意味します。たとえば、値 1/1/0001 1:00:00 AM +02:00 は、UTC に変換すると MinValue より 1 時間早いため、範囲外です。」

また ( DateTimeOffset.MaxValue ):

「DateTimeOffset 値は、メソッドが MaxValue と比較する前に協定世界時 (UTC) に変換されます。これは、日付と時刻が最大範囲に近いが、オフセットが負の DateTimeOffset 値は、例外をスローする可能性があることを意味します。たとえば、値 12/31/9999 11:00 PM -02:00 は、UTC に変換すると MaxValue より 1 時間遅れているため、範囲外です。」

また、ドキュメント ( DateTimeOffset Constructor )に従って、非 UTC に適用されるKindオフセットは「ローカル システムの現在のタイム ゾーンのオフセット」です。

于 2012-12-10T10:49:55.840 に答える
17

負の UTC ゾーンにいるチームの一部によって導入されたこの問題が発生しました...

chamila_c が投稿したことが、これが発生する本当の理由ですが、迅速な修正が必要でした.

「それを解決する」ために、基本的にこの拡張機能を作成しました:

public static class DateTimeExtensions
{
    public static DateTimeOffset ToDateTimeOffset(this DateTime dateTime)
    {
        return dateTime.ToUniversalTime() <= DateTimeOffset.MinValue.UtcDateTime
                   ? DateTimeOffset.MinValue 
                   : new DateTimeOffset(dateTime);
    }
}

MaxValue と照合することもできます。

于 2014-07-22T15:13:33.037 に答える
4

扱うデータ型が DateTime の場合は、Kind を指定して DateTime オブジェクトを作成する必要があります。

DateTime maxDate = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.UTC);

これが DateTimeOffset データ型に変換されると、そのエラーは発生しません。

于 2020-10-23T15:47:29.363 に答える