DateTime反序列化为前一天 - UTC Gotcha

时间:2016-10-11 23:42:57

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我继承了一个以当地时间存储日期的应用程序。我已经对它进行了现代化改造,并勉强继续使用处理当地时间日期的业务层。

我发给服务器的帖子是用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。需要测试它是否仍然可以与应用程序的其他部分一起使用。

0 个答案:

没有答案