2

WCF サービスから DateTime を使用してデータを取得する WPF クライアントがあります。

コンピューターをローマ時間 (+1) にすると、結果に奇妙な動作が見られます。

私のWCFメソッド

        public IEnumerable<BookingType> BookingsForFollowingDayReport(DateTime date) {

        el = new ErrorLogging();
        el.CreateLog(db, new Entities.ErrorType() { DateLogged = DateTime.Now, Type = "DTE", Message = "Report Date: " + date.ToString() });

        var a = (from b in db.GetTable<BookingType>()
                 where b.TourStartDateTime >= date.Date && b.TourStartDateTime <= date.AddDays(1).Date
                 orderby b.TourStartDateTime
                 select b);

        if (a.Count() > 0) {
            el.CreateLog(db, new Entities.ErrorType() { DateLogged = DateTime.Now, Type = "DTE", Message = "Report Date: " + a.FirstOrDefault().TourStartDateTime });
        }

        return a;
    }

このサービスはどこかの Web サーバーでオンラインになっており、現在は WPF クライアントから呼び出しています。メソッド内のログに注意してください。

私の通話コード

    public static async Task<Bookings> GetBookingsReport(DateTime forWhen) {
        Bookings bookings = new Bookings();
        if (MyNetwork.IsOnline) {
            var bookingTypes = new ReportsServiceClient.BookingType[0];

                //forWhen = new DateTime(2013, 01, 10);
                bookingTypes = await ReportsServiceClient.BookingsForFollowingDayReportAsync(forWhen);


            bookings.TourBookings = (from b in bookingTypes
                                     where b.RecordType == "H"
                                     select new Booking(b)).ToList();

        }
        return bookings;
    }

さて、奇妙さのために...

DatePicker次のように の値を使用して、XAML コード ビハインドから「呼び出し元のコード」を呼び出しawait DataManager.GetBookingsReport(datePicked.SelectedDate.Value);ますBookingsForFollowingDayReportAsync

変数forWhenは実際には 2013 年 10 月 1 日です。..WCF サービスのログ コードを受け入れると、2013 年 9 月 1 日が送信されたと表示されます。それで、forWhen手動で設定した行のコメントを外します-テストするだけです-そしてそれは機能します、ロガーは10/01/2013と言います。

これを数日間テストしましたが、DatePicker で 3 日先 (過去または未来) を選択すると、明日の日付に常に問題が発生します。たとえば、正しい日付が記録されます。

タイムゾーンを英国の GMT 時間に戻すと、このバグはまったく発生しません。

forWhen手動で設定すると問題が解決するため、日付ピッカーに関係している可能性があると思いますが、これはどのように発生するのでしょうか?

編集1 私はforWhen手動で設定することで、問題を解決することができましたforWhen

forWhen = new DateTime(forWhen.Year, forWhen.Month, forWhen.Day);

私は問題と私が見つけた解決策に当惑しています...何か説明はありますか?

4

1 に答える 1

6

既定では、WCFDateTimeはローカル タイム ゾーンに基づいてオブジェクトをシリアル化および逆シリアル化します。これはDateTime、クライアントからのがサーバー上で逆シリアル化されると、サーバー上で 1 時間減少することを意味します。どうやらあなたの時間部分は0(真夜中)なので、昨日の日付を説明できます。

解決策の 1 つは、DateTime 変数をサービスに渡す前に、次のように明示的に設定DateTime.Kindすることです。DateTimeKind.Unspecified

DateTime forWhenSvcArg = DateTime.SpecifyKind(forWhen, DateTimeKind.Unspecified);

これは、コンストラクターも呼び出して forWhen を設定したときに得られるものです。

于 2013-01-09T12:22:01.280 に答える