【问题标题】:Unexpected DateTime output when receiving JSON in .NET webservice在 .NET Web 服务中接收 JSON 时出现意外的 DateTime 输出
【发布时间】:2015-09-17 08:14:04
【问题描述】:

我有一段代码在使用 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 存储了 @ 的值987654332@ 永远不会比较,因为它正在与 2015-09-17 09:00:00 进行比较

有没有什么办法可以停止字符串到日期时间的转换过程,添加服务器的时区?

【问题讨论】:

  • @varocarbas 在函数 FindDuplicates dateToCompare 的第一行中,当它转换为 DateTime 类型时,它的时区已经添加到其中
  • 如果您在 .NET 3.5 中使用 ASP.NET AJAX,我认为自动使用的 JSON 序列化程序是 JavaScriptSerializer,而不是 Json.NET。来源:techblog.dorogin.com/2012/05/…。您如何配置/设置 JSON 序列化程序?
  • 您应该指定相应转换为DateTime 的条件(通过序列化程序,如dbc 建议的那样,或通过任何其他方式)。我删除了我以前的 cmets,因为不完全确定它在这里的实际适用性。在任何情况下,提供的代码(即仅包括dateToCompare As Nullable(Of DateTime) 和输入字符串)都不足以理解问题。必须执行从字符串到DateTime 的转换(在非常糟糕的情况下,它可能会通过Option Strict Off 隐式执行)并且应该突出显示这部分。

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


【解决方案1】:

根据文章Json serializers in ASP.NET and other,问题在于您似乎在.NET 3.5 中使用ASP.NET AJAX,而这实际上使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2012-03-11
    • 2013-11-18
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多