我有一段代码在获取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的转换过程添加服务器的时区?
答案 0 :(得分:0)
问题在于,您似乎在.NET 3.5中使用ASP.NET AJAX,根据文章Json serializers in ASP.NET and other,这实际上使用JavaScriptSerializer
来反序列化方法参数。因此,Json.NET不会为您DateTime
反序列化,JavaScriptSerializer
正在为您反序列化
根据JavaScriptSerializer UTC DateTime issues,JavaScriptSerializer
似乎有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