ArgumentOutOfRangeException: The UTC time represented when the offset is applied must be between year 0 and 10,000.について

開発中のゲームで、特定の端末で進行不能事態発生!! 早急に原因究明に動きました。

結論から言いますと、初期値が不適切で、端末タイムゾーンがUTCよりマイナスになっていると発生する不具合でした。 特定の端末のみ進行不能エラーが出たと思ったらその端末のみタイムゾーンがUTCよりマイナスになっていました。

Unity上で確かめてみると

public System.DateTimeOffset offset = System.DateTime.MaxValue;

と宣言しているところで ArgumentOutOfRangeException: The UTC time represented when the offset is applied must be between year 0 and 10,000. のエラーが表示されました。 Googleで翻訳してみましたら「オフセットが適用されるときに表されるUTC時間は、0年から10,000の間でなければなりません。」

System.DateTime.MaxValueの値は9999/12/31 23:59:59です。 タイムゾーンが日本の時のUTC時間で出力しましたら 9999/12/31 14:59:59 とUTC時間より9時間進んでいる場合UTC時間は9時間前になります。 これはもしタイムゾーンがUTCよりマイナスならその分UTC時間が進んで10000年超えますね...

逆に

public System.DateTimeOffset offset2 = System.DateTime.MinValue;

にしたら 今度は日本に戻したときに同様のエラーが出力されました。 System.DateTime.MinValueは0001/01/01 0:00:00ですから、当然ですよね...

結論といたしまして

public System.DateTimeOffset offset = new System.DateTimeOffset();

とシンプルにnewで宣言するのが一番ですね。

これで大丈夫だと思っていたのですが、新たな問題が発生いたしました。

    public long Yesterday
    {
        get { return offset.AddDays(-1).ToUnixTimeSeconds(); }
    }

と前日の日を取得するところで ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime. のエラーが表示されました。 どうやら初期値のまま使っている時がありましたので

        get { return new System.DateTimeOffset() == offset ? offset.ToUnixTimeSeconds() : offset.AddDays(-1).ToUnixTimeSeconds(); }

と初期値から変更されていないなら減らさないようにする事で解決いたしました。 本当は初期値なら本日の値を入れていないということなので使わないのが一番ですけれどね...

時間系の処理を作成したらタイムゾーンを変更しても問題ないか動作テストを行う必要がありますね。

以上 山中がお伝えしました。またお会いしましょう!

Yamanaka

Programmer

ArgumentOutOfRangeException: The UTC time represented when the offset is applied must be between year 0 and 10,000.について

お気軽に
お問い合わせください。

お問い合わせ