ASP.NET控制器FormatException:字符串未被识别为有效的DateTime

时间:2018-11-07 17:41:29

标签: c# json asp.net-mvc api controller

在邮递员中,我通过POST将以下JSON发送到API。

{
"id": "21",
"crgName": "Walgreens - 11/07/2018 - Standard ",
"crgStarteddatetime": "2018-11-07T10:11:10",
}

...但是,出现以下错误: FormatException:无法将字符串识别为有效的DateTime。

在控制器内部,我使用DateTimeFormat格式化日期时间:

 public static RemoteContextType DeserializeJsonString<RemoteContextType>(string jsonString)
        {
            //create an instance of generic type object
            RemoteContextType obj = Activator.CreateInstance<RemoteContextType>();
            MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonString));

            var serializer = new DataContractJsonSerializer(obj.GetType(),
                new DataContractJsonSerializerSettings
                {
                    DateTimeFormat = new

                             DateTimeFormat("yyyy-MM-dd'T'HH:mm:ss.fff'Z'")
                });

            obj = (RemoteContextType)serializer.ReadObject(ms);

            ms.Close();

            return obj;
           }

...我的语法中是否存在日期格式的问题?我的意图是格式化日期,因为它反映在JSON中。我做错了什么可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

问题出在这一行:

DateTimeFormat = new DateTimeFormat("yyyy-MM-dd'T'HH:mm:ss.fff'Z'")

您要使用'Z'格式说明符和3秒秒分数(fff format specifier)来指定与UTC / Zulu日期时间完全相同的格式,但是crgStarteddatetime中使用的值不正确两者都有(即yyyy-MM-dd'T'HH:mm:ss)。

基于JSON示例,您应该更改格式以完全匹配crgStarteddatetime中提供的格式:

var serializer = new DataContractJsonSerializer(obj.GetType(), new DataContractJsonSerializerSettings
                 {
                     DateTimeFormat = new DateTimeFormat("yyyy-MM-dd'T'HH:mm:ss")
                 });

如果crgStarteddatetime的实际JSON数据具有混合的日期格式(某些日期具有yyyy-MM-dd'T'HH:mm:ss,而其他日期可能具有yyyy-MM-dd'T'HH:mm:ss'Z'),请使用K format specifier,它更灵活处理时区格式:

var serializer = new DataContractJsonSerializer(obj.GetType(), new DataContractJsonSerializerSettings
                 {
                     DateTimeFormat = new DateTimeFormat("yyyy-MM-dd'T'HH:mm:ssK")
                 });