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

C# : Could not parse the correct date and time to the current system time zone

我有一个 returns 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(纽约)时,对于每条记录,开始时间都不会解析为相应的系统时区。 我在这里缺少什么?

Json.NET 允许您通过 DateTimeZoneHandling 序列化程序设置指定哪种 DateTime 到 return(UTC,本地)。默认为本地。

要 return 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 中使用 Ticks。当您使用多个时区时,这会非常方便。参考下面的例子。

DateTime.UtcNow.Ticks