2

我有一个 WPF 客户端,它使用来自 WCF 服务的 DateTime 检索数据。

当我将计算机置于罗马时间 (+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;
    }

现在对于奇怪...

我使用 ' 值从后面的 XAML 代码中调用'调用代码',DatePicker如下所示:await DataManager.GetBookingsReport(datePicked.SelectedDate.Value);我将通过代码调试到BookingsForFollowingDayReportAsync被调用的位置。

变量forWhen实际上是 10/01/2013,太棒了!..accept 我在 WCF 服务中的日志记录代码说 09/01/2013 已发送通过。所以然后我取消注释我forWhen手动设置的行 - 只是为了测试 - 它有效,记录器说 10/01/2013。

我已经测试了几天,明天的日期总是有问题,如果我在我的 DatePicker 中选择三天(过去或未来),例如记录正确的日期。

如果我将时区设置回英国格林威治标准时间,这个错误也根本不会发生。

我有一个想法,它可能与日期选择器有关,因为forWhen手动设置可以解决问题,但这是怎么发生的呢?

编辑 1 我现在已经设法解决了这个问题,通过forWhen手动设置,使用forWhens Values 像这样(看起来很荒谬):

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

我对这个问题和我找到的解决方案感到困惑......有什么解释吗?

4

1 回答 1

6

默认情况下,WCFDateTime根据本地时区对对象进行序列化和反序列化。这意味着DateTime在您的情况下反序列化时,来自客户端的客户端会在服务器上减少一小时。显然您的时间部分是 0(午夜),这样就可以解释昨天的日期。

一种解决方案是在将 DateTime 变量传递给服务之前显式设置DateTime.Kind为,如下所示:DateTimeKind.Unspecified

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

这就是你通过调用构造函数设置 forWhen 时得到的结果。

于 2013-01-09T12:22:01.280 回答