我有一个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服务中的日志代码说09/01/2013发送通过。那么我取消注释我手动设置forWhen
的行 - 只是为了测试 - 并且它起作用,记录器说10/01/2013。
我已经在几天内对此进行了测试,如果我在我的DatePicker中选择了三天(过去或将来),例如记录了正确的日期,那么明天的日期总是有问题。
如果我将时区设置回英国格林威治标准时间,那么这个错误根本不会发生。
我已经知道它可能与日期选择器有关,因为设置forWhen
会手动删除问题,但这怎么可能发生呢?
修改1
我已经成功地解决了这个问题,方法是手动设置forWhen
,使用forWhen
s这样的值(因为它看起来没有意义):
forWhen = new DateTime(forWhen.Year, forWhen.Month, forWhen.Day);
我对这个问题以及我找到的解决方案感到困惑......有任何解释吗?
答案 0 :(得分:6)
默认情况下,WCF根据本地时区对DateTime
个对象进行序列化和反序列化。这意味着在您的情况下反序列化时,客户端的DateTime
会在服务器上减少一个小时。显然你的时间部分是0(午夜),所以这可以解释昨天的日期。
其中一个解决方案是在将DateTime变量传递给服务之前将DateTime.Kind
显式设置为DateTimeKind.Unspecified
,如下所示:
DateTime forWhenSvcArg = DateTime.SpecifyKind(forWhen, DateTimeKind.Unspecified);
这是你通过调用构造函数设置时所得到的。