DateTime WPF - WCF跨时区的奇怪行为



我有一个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;
    }

现在是奇怪的…

我使用DatePicker的值从后面的XAML代码调用"调用代码",如:await DataManager.GetBookingsReport(datePicked.SelectedDate.Value);和我将通过代码调试到调用BookingsForFollowingDayReportAsync的点。

变量forWhen实际上是10/01/2013,太好了!..在WCF服务中接受我的日志代码,显示2013年9月1日发送通过。因此,然后我取消了手动设置forWhen的行注释-只是为了测试-并且它工作,日志记录器显示10/01/2013。

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

如果我将我的时区设置回英国GMT时间,这个错误也不会发生。

我有一个想法,这可能与日期选择器有关,因为设置forWhen手动消除了问题,但这怎么可能发生?

编辑1 我现在已经设法解决了这个问题,通过手动设置forWhen,使用forWhen的值,像这样(看起来毫无意义):

forWhen = new DateTime(forWhen.Year, forWhen.Month, forWhen.Day);
我被这个问题和我找到的解决方法难住了。任何解释吗?

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

解决方案之一是在将DateTime变量传递给服务之前显式地将DateTime.Kind设置为DateTimeKind.Unspecified,如下所示:
DateTime forWhenSvcArg = DateTime.SpecifyKind(forWhen, DateTimeKind.Unspecified);

这就是你通过调用构造函数来设置forWhen所得到的

相关内容

  • 没有找到相关文章