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

C# C:无法将正确的日期和时间解析为当前系统时区,c#,json,datetime,json-deserialization,C#,Json,Datetime,Json Deserialization,我有一个返回json的服务,如下所示: [ { "title":"First event", "startDate":"\/Date(1495512000000-0400)\/", "endDate":"\/Date(1495857540000-0400)\/", } ] 我针对我定义的模型将json输出反序列化到列表中: 模型 C反序列化代码 我正在使用Newtonsoft.Json包进行反序列化 List< EventModel

我有一个返回json的服务,如下所示:

[  
   {  
      "title":"First event",
      "startDate":"\/Date(1495512000000-0400)\/",
      "endDate":"\/Date(1495857540000-0400)\/",
   }
]
我针对我定义的模型将json输出反序列化到列表中:

模型

C反序列化代码

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

List< EventModel > lstEvent = new List< EventModel >();
lstEvent = JsonConvert.DeserializeObject<List< EventModel >>(await objMyServices.GetData());
因此,在本例中,当我调试时,我在两个不同的时区获得以下输出:

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

开始时间:2017年5月23日09:30:00

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

GMT-4:00纽约时间:

开始时间:2017年5月23日00:00:00

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

因此,对于每个记录,当我切换到GMT-4:00纽约时,开始时间不会解析到相应的系统时区。
这里我缺少什么?

Json.NET允许您指定通过序列化程序设置返回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。此类型保留原始偏移量。

您可以在Web API中为此使用记号。这在处理多个时区时非常方便。请参阅下面的示例

DateTime.UtcNow.Ticks

那不是Json日期。JSon日期根据ISO8601进行格式化。这是AJAX时代非常古老的格式。一些非常古老的服务仍然使用它,但您使用的日期时间可以是本地的、UTC的或未定义的。返回日期的DateTimeKind属性是什么?如果在纽约转换为本地时间,相同的UTC时间将显示不同,但仍然是相同的时间。如果未明确指定要使用的DateTimeKind,则在显示时它也会显示不同use@PanagiotisKanavos-我认为它应该使用ISO8601,但没有任何要求:@Code裸体它是事实上的标准,这是sameI在xamarin中开发的应用程序,所以当设备的时区发生变化时,它应自动转换为设备的当前时区。我同意api是旧的。但这是无法改变的。如何解决此问题。当我将属性更改为DateTimeOffset时,我无法获取时间。输出是:起始日期{23-05-2017 00:00:00-04:00}这不是实际值吗,23-05-2017 00:00:00-04:00?第二个是2017年5月26日23:59:00-04:00?是的,我怎么知道当地时间和日期。因为是UTC。我需要将本地日期和时间上的事件添加到设备calendarDateTimeOffset包含实际偏移量。不是UTC。根据定义,UTC表示偏移量为0。如果你需要当地时间,为什么要问这个问题?您发布的值与正确的本地时间相对应。纽约的午夜是加尔各答的上午9:30。在这种情况下,您的原始代码运行得很好。无论如何,您可以使用.LocalDateTime或.UtcDateTime从DateTimeOffset获取DateTime值。不过你得先决定要哪一个
DateTime.UtcNow.Ticks