C#:无法解析当前系统时区的正确日期和时间

时间:2017-05-25 11:55:25

标签: c# json datetime json-deserialization

我有一个返回json的服务:

[  
   {  
      "title":"First event",
      "startDate":"\/Date(1495512000000-0400)\/",
      "endDate":"\/Date(1495857540000-0400)\/",
   }
]

相对于我定义的模型,我将json输出反序列化到列表中:

模型

public class EventModel
{
    [JsonProperty("title")]
    public string Title { get; set; }

    [JsonProperty("startDate")]
    public DateTime StartDate { get; set; }

    [JsonProperty("endDate")]
    public DateTime EndDate { get; set; }
}

C#反序列化代码

我使用Newtonsoft.Json包进行反序列化。

List< EventModel > lstEvent = new List< EventModel >();
lstEvent = JsonConvert.DeserializeObject<List< EventModel >>(await objMyServices.GetData());

所以在这种情况下,当我调试时,我在两个不同的时区得到以下输出:

GMT + 5:30(加尔各答 - 印度):

开始时间:23-05-2017 09:30:00

结束时间:27-05-2017 09:29:00

GMT-4:00(纽约):

开始时间:23-05-2017 00:00:00

结束时间:26-05-2017 23:59:00

因此,对于每个记录,当我切换到GMT-4:00(纽约)时,开始时间不会被分析到相应的系统时区。 我在这里失踪的是什么?

2 个答案:

答案 0 :(得分:1)

Json.NET允许您通过DateTimeZoneHandling序列化程序设置指定要返回的DateTime类型(UTC,Local)。默认值为Local。

要返回UTC DateTime,请使用DateTimeZoneHandling.Utc:

var settings = new Newtonsoft.Json.JsonSerializerSettings() 
               {
                   DateTimeZoneHandling = DateTimeZoneHandling.Utc 
               };
var content=await objMyServices.GetData();
var lstEvent = JsonConvert.DeserializeObject<List<EventModel>>(content, settings);

或许更好的选择是将属性类型更改为DateTimeOffset。此类型保留原始偏移量。

答案 1 :(得分:0)

您可以在Web API中使用SELECT id FROM posts WHERE content LIKE '%searchterm%' OR WHERE tags LIKE '%searchterm%' OR WHERE title LIKE '%searchterm%' 。使用多个时区时,这非常方便。参考下面的例子。

Ticks