5

私は24時間年中無休で実行されているGPSデバイスのレポートを実行するソフトウェアに取り組んでいます。レポート出力の一部では、保存されているデータベース時間(中部標準時で保持)をユーザータイマー(要求されたタイムゾーン)に変換する必要があります。年に2回、時間変更の前に開始して時間変更後に終了するレポートを実行すると、DSTの問題が発生します。1行で失敗します:

return TimeZoneInfo.ConvertTime(dateToConvert, DatabaseTime, UserTime);

dateToConvertDateTime変換されるです。DatabaseTimeUserTimeは両方ともTimeZoneInfoオブジェクトです。トリッキーなことや複雑なことは何もしていませんが、DST時間変更に近いDateTimesは例外をスローします。3/10/2013 2:02:11 AM中部標準時から中部標準時に「変換」されている場合など。

DST時間の変更に近いDateTimeを処理するための最良の方法は何ですか?

4

4 に答える 4

4

データベースにゴミがあります。2013年3月10日2:02:11AMは存在しませんでした。その朝の午前1時59分から午前3時の1分後、時計が1時間移動しました。.NETはそのジャンク日付に我慢するつもりはありません。

そのガベージタイムスタンプがどのようにしてdbaseに格納されたかを確認する必要があります。明らかに、あるタイムゾーンから別のタイムゾーンへの時間の変換は、一方がアクティブで他方がアクティブでないように、夏時間のルールを無視するため、そのゴミの原因である可能性が非常に高くなります。UTCを使用するようにdbaseを修正できない場合は、少なくともコードで修正してください。最初に一方のタイムゾーンでUTCに移動し、次にもう一方のタイムゾーンで現地時間に戻ります。TimeZoneInfoクラス、ConvertTimeFrom/ToUtcメソッドを使用します。

于 2013-03-18T17:55:59.697 に答える
3

この問題に遭遇しました。新しい GMT 時間列を追加して修正しました。これにより、アプリケーションは元のデータを処理し、修正は GMT で処理できるようになりました。次に、夏時間に問題があるコードがこの新しい列にアクセスできるように、アプリケーションを変更しました。また、時間の経過とともに、計算に使用されたコードをこの新しい列に再指定し、ディスプレイが古い列で動作するようにしました。エレガントではありませんが、機能し、簡単です。

于 2013-03-18T17:48:42.940 に答える
1

それが可能であれば、私は他の答えの1つに従います-これを適切に修正したいのです。秋の移行中に時間が正しくない場合、例外は生成されません。ランダムに1時間オフになります。

現在のジャムから抜け出すための回避策があります。例外が発生するのは春の間に欠落している時間だけなので、例外をキャッチして、変換を繰り返す前に時間を追加することができます。

于 2013-03-18T21:04:06.763 に答える
1

ハンスが述べたように、時間は本当にジャンクではなく、調整されていないだけなので、変換は適切に機能するはずです(私が発明したばかりの用語)。3/10/2013 2:02:11 AM CDT == 3/10/2013 8:02:11 AM UTC == 3/10/2013 3:02:11 AM CDT...それらはすべて意味的に同等です。信じられない場合は、timeanddate.comで変換を行って、それらがすべて等しいことを確認してください (計算機では、最も近い 5 分に丸められます)。.NET コードがこのセマンティックの等価性を許容するかどうかはわかりませんが、現在開発ボックスの前にいないため、試していません。

更新#1:

CST タイム ゾーンに設定されたコンピューターで次のコードを実行します。

using System;

namespace TimeZoneSample
{
    public static class Program
    {
        public static void Main()
        {
            DateTime t = DateTime.Parse("3/10/2013 2:02:11 AM");
            Console.WriteLine(t);
            Console.WriteLine(t.ToUniversalTime());
            Console.WriteLine(t.ToUniversalTime().ToLocalTime());
        }
    }
}

これにより、次のコンソール出力が得られます。

3/10/2013 2:02:11 AM
3/10/2013 8:02:11 AM
3/10/2013 3:02:11 AM

私の元の説明が正しいことの証明。quod erat デモンストランダム

于 2013-03-18T18:29:43.043 に答える