2017-05-25 32 views
0

我有它返回一个json这样的服务:C#:无法解析正确的日期和时间设置为当前系统时间区

[ 
    { 
     "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#deseria的代码lization

我正在使用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九时29分零零秒

对于GMT-4:00(纽约):

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

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

因此,对于每一条记录,开始时间不解析,当我切换到GMT-4:00(纽约)时的相应系统时区。 我在这里错过了什么?

+0

这不是Json的日期。 JSon日期根据ISO8601进行格式化。这是AJAX时代的一种非常古老的格式。一些*非常*旧的服务仍然使用它,虽然 –

+0

此外,您使用DateTime可以是本地,UTC或未定义。返回日期的DateTimeKind属性是什么?如果在纽约将本地时间转换为相同的UTC时间,则它们的显示方式会有所不同,但它仍然是同一时间。如果您没有明确指定要使用什么DateTimeKind –

+0

@PanagiotisKanavos - 我相信它*应该*使用ISO8601,但它没有任何要求:https:// stackoverflow。com/questions/10286204/the-right-json-date-format – CodeNaked

回答

1

Json.NET允许您指定通过DateTimeZoneHandling序列化程序设置返回什么样的DateTime(UTC,Local)。默认是本地。

要返回UTC日期时间,使用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。这种类型保留了原始偏移量。

+0

当我将属性更改为DateTimeOffset时,我没有时间。输出是:StartDate {23-05-2017 00:00:00 -04:00} –

+0

是不是实际值,'23-05-2017 00:00:00 -04:00'?第二个'26-05-2017 23:59:00 -04:00'? –

+0

是的,我将如何获得当地时间和日期。由于它是UTC。我需要将本地日期和时间的事件添加到设备日历 –

0

您可以在此Web API中使用Ticks。当您使用多个时区时,这非常方便。参考下面的例子。

DateTime.UtcNow.Ticks