我继承了一个以当地时间存储日期的应用程序。我已经对它进行了现代化改造,并勉强继续使用处理当地时间日期的业务层。
我发给服务器的帖子是用JSON编写的,我写的Javascript将它发送到包含偏移信息的服务器,例如。
{"name":"aal","dob":"1921-10-06T00:00:00+10:30"}
但是,ASP.NET将其反序列化为UTC。因此,如果我在Datepicker中选择2016年7月6日,服务器会将其反序列化为2016年7月5日。
我的问题很简单。如何在客户端和服务器之间进行思维会议。如果我选择7月6日,我想坚持7月6日(显然)。
注意:这不是WebAPI。好老香草MVC 5.
一个客户端,我添加以下代码以确保发布到服务器的JSON有效负载不是UTC:
// Include offset info in the JSON that gets posted to the server.
Date.prototype.toJSON = function() {
return moment(this).format();
}
然后,我使用以下代码发布它(dob是有问题的日期):
var getPotentialDuplicatePatients = function (name, dob) {
return $http({
data: { name: name, dob: dob },
url: "/PatientData/CheckForPotentialPatientDuplicates",
method: 'POST'
});
};
Controller中的Action方法如下所示:
[HttpPost]
public ActionResult CheckForPotentialPatientDuplicates(string name, DateTime dob)
{
var duplicates = Enumerable.Empty<PatientPlusEpCountDto>();
if (//Authorize(WebConstants.EditAction, WebConstants.SurgeonAndDataManagerProtectedResource) &&
Execute(() => duplicates = _mediator.Send(new GetPotentialPatientDuplicatesQuery
{
DateOfBirth = dob,
PatientName = name
})))
{
return JsonNet(duplicates);
}
return JsonError(Errors);
}
所有这一切的另一个有趣的方面是复杂对象的DateTime属性没有遭受同样的不幸。在上面,您可以看到参数是本机类型。如果发布包含DateTime属性的复杂类型,则所有类型都按预期工作。
TimeOfDay在它们之间是不同的。使用原始本机DateTime,它包括一天中的某个时间(即使JSON对象是凌晨12:00)。在复杂类型中,正如预期的那样是凌晨12:00。
Runnin,我将尝试将有效负载包装在一个复杂的对象中(我将创建它),看看是否能解决它。
更新 - 温度分辨率
我必须编写以下可怕的黑客程序才能让它按预期工作:
var transformDob = new DateTime(dob.Ticks, DateTimeKind.Utc).ToLocalTime();
var dateOfBirth = transformDob.Date;
我删除了修改Date原型的代码。现在,json请求又回到了UTC。需要测试它是否仍然可以与应用程序的其他部分一起使用。