C#JsonConvert.DeserializeObject使用GMT + 1或BST自定义日期解析

时间:2018-06-02 08:41:38

标签: c#

我们正在使用以下格式收到我们收到日期时间的任何API。

  • 03/21/2018 11:08 GMT
  • 03/26/2018 03:10 PM BST
  • 03/21/2018 11:08 AM GMT + 1

如何在解析JSON时转换此日期时间。

我们尝试使用这个json IsoDateTimeConverter

public class DateFormatConverter : IsoDateTimeConverter
{
    public DateFormatConverter(string format) => DateTimeFormat = format;
}

并在财产中使用

 [JsonConverter(typeof(DateFormatConverter), "MM/dd/yyyy hh:mmtt Z")]
        public DateTime createdOn { get; set; }

收到错误:字符串未被识别为有效的DateTime。

1 个答案:

答案 0 :(得分:0)

您应该将DateFormatString定义为"MM/dd/yyyy hh:mmtt \"GMT\"z" z指定了偏移值。由于无法识别时区缩写,因此您无法使用适用于各种时区的格式,这就是提及GMT指定格式的原因。

为什么缩写无法识别

缩写词具有多对一关联。例如,“AMT”意味着不同的东西,取决于您的文化,您所处的世界的哪个部分以及您的应用环境。

AMT "Armenia Time" Asia          UTC + 4 hours 
AMT "Amazon Time"  South America UTC - 4 hours 

完整解决方案代码

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

public class TestClass
{
    public int Id {get; set;}
    public DateTime Date {get; set;}

    public override string ToString()
    {
        return string.Format("Id : {0} Date : {1}", this.Id, this.Date);
    }
}

public class Program
{
    public static void Main()
    {
        var jsonString = "[{\"id\":1, \"date\":\"03/21/2018 11:08AM GMT\"}, {\"id\":2, \"date\":\"03/18/2018 11:08AM GMT+1\"}, {\"id\":3, \"date\":\"03/15/2018 11:08AM GMT+10\"}]";

        var list = JsonConvert.DeserializeObject<List<TestClass>>(jsonString, new JsonSerializerSettings() { DateFormatString  = "MM/dd/yyyy hh:mmtt \"GMT\"z"});

        list.ForEach((item) => Console.WriteLine(item));
    }
}

以上程序的输出如下(基于我目前的文化,即en-US)

  

Id:1日期:3/21/2018 11:08:00 AM

     

Id:2日期:3/18/2018 10:08:00 AM

     

Id:3日期:3/15/2018 1:08:00 AM

检查实时小提琴here