在.NET Webservice中接收JSON时出现意外的DateTime输出

时间:2015-09-17 08:14:04

标签: json vb.net datetime .net-3.5 json.net

我有一段代码在获取json日期参数时给我一个意外的输出。 (这已被注意到,因为该软件正在与其创建的时区不同的时区使用)

html是一个基本的jquery datepicker字段,所以没有错。我只是想将所选日期与数据库中的日期相匹配。

进入WebMethod FindDuplicates的JSON日期时间格式正确

2015-09-17T00:00:00.000Z

调用webservice的javascript只是:

findDuplicates : function(options, success, error) {
    if(''+options.name == '' && ''+options.dateToCompare == '') {
        success&&success([], 'success', null);
        return;
    }
    return $software.__call_ajaxws('/webservices/FindDuplicates', { nameToMatch: options.name || null, dateToCompare: options.dateToCompare }, null, success || void (0), error || void (0), { elContent: 'Searching for duplicate records' });
}

在此(无工作)代码中,变量dateToCompare

<WebMethod(), ScriptMethod(ResponseFormat:=ResponseFormat.Json), PrincipalPermission(SecurityAction.Demand, Authenticated:=True)> _
Public Function FindDuplicates(ByVal nameToMatch As String, ByVal dateToCompare As Nullable(Of DateTime))
    Dim someValue as String = "Foo"

Dim someValue as String = "Foo"dateToCompare的值已变为2015-09-17 09:00:00

如果我将dateToCompare的类型更改为字符串,则会将其正确显示为2015-09-17 00:00:00

由于某些原因我无法解决,在将参数转换/转换为DateTime时,它决定将服务器的时区添加到日期,从而向比较函数发送不正确的日期,这意味着DB存储的值为{ {1}}不会比较,因为它与2015-09-17 00:00:00

进行比较

有没有我可以停止字符串到datetime的转换过程添加服务器的时区?

1 个答案:

答案 0 :(得分:0)

问题在于,您似乎在.NET 3.5中使用ASP.NET AJAX,根据文章Json serializers in ASP.NET and other,这实际上使用JavaScriptSerializer来反序列化方法参数。因此,Json.NET不会为您DateTime反序列化,JavaScriptSerializer正在为您反序列化

根据JavaScriptSerializer UTC DateTime issuesJavaScriptSerializer似乎有DateTime结构正确反序列化时区的错误。该问题进一步表明了一种解决方法:将您的参数声明为DateTimeOffset,然后使用UtcDateTime属性提取时间。

Public Function FindDuplicates(ByVal nameToMatch As String, ByVal dateToCompare As Nullable(Of DateTimeOffset))
    Dim actualDateToCompare as Nullable(Of DateTime)
    if dateToCompare Is Nothing Then
        actualDateToCompare = Nothing
    else
        actualDateToCompare = dateToCompare.Value.UtcDateTime
    End If

一个简单的测试用例(在c#中)似乎表明这解决了这个问题:

        var jsonString = @"""2015-09-17T00:00:00.000Z""";

        var ok1 = (Newtonsoft.Json.JsonConvert.DeserializeObject<DateTime>(jsonString) == new JavaScriptSerializer().Deserialize<DateTimeOffset>(jsonString).UtcDateTime);
        Debug.Assert(ok1); // No assert

        var ok2 = (Newtonsoft.Json.JsonConvert.DeserializeObject<DateTime>(jsonString) == new JavaScriptSerializer().Deserialize<DateTime>(jsonString));
        Debug.Assert(ok2); // Assert FAILS