繁体   English   中英

JSON.NET:字符串 '7/1/20 14:15' 未被识别为有效的 DateTime

[英]JSON.NET: String '7/1/20 14:15' was not recognized as a valid DateTime

我无法使用 EPPlus 从 Excel 反序列化日期时间字符串。 我已经阅读了有关此问题的其他答案,但仍然无法正常工作并收到错误消息:String 'Md-yy hh:mm' 未被识别为有效的 DateTime。

根据在此主题上找到的其他答案,我已将 DateTimeFormat 更改为“M/d/yy hh:mm”,这是当我戴上手表时 EPPlus 以字符串形式返回的内容。 我目前的文化是“en-UK”,但是我使用的是 InvariantCulture,因为 EPPlus 输出的是我宁愿使用的上述格式。 如果这是一个问题,那么我不介意更改它,但我不认为从美国格式转换为英国格式的意义,只是因为它在数据库中再次更改为国际 ISO 格式。

它仍然必须以某种方式认为它遵循英国日期时间格式,但我看不出哪里出错了。 任何帮助将不胜感激! 谢谢

这是我目前所拥有的:

                var dateTimeConverter = new IsoDateTimeConverter
                {
                    Culture = CultureInfo.InvariantCulture,
                    DateTimeFormat = "M/d/yy h:mm",
                    DateTimeStyles = DateTimeStyles.AssumeLocal
                };

                var excelImportResponse = new ExcelImportResponse<T>();
                foreach (DataRow row in dataTable.AsEnumerable())
                {
                    excelImportResponse.Objects.Add(
                        JsonConvert.DeserializeObject<T>(
                            new JObject(
                                row.Table.Columns
                                    .Cast<DataColumn>()
                                    .Select(c => new JProperty(c.ColumnName.Trim(), JToken.FromObject(row[c])))
                                )
                                .ToString(Formatting.None),
                                new JsonSerializerSettings
                                {
                                    Error = delegate (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
                                    {
                                        excelImportResponse.Errors.Add(args.ErrorContext.Error.Message);
                                        args.ErrorContext.Handled = true;
                                    },
                                    Converters = { dateTimeConverter }
                                })
                        );
                }

我的代码

错误:String '7/1/20 14:15' 未被识别为有效的 DateTime。

System.DateTimeParse.ParseExact(ReadOnlySpan 1 s, ReadOnlySpan 1 format, DateTimeFormatInfo dtfi, DateTimeStyles style) at System.DateTime.ParseExact(String s, String format, IFormatProvider provider, DateTimeStyles style) at Newtonsoft.Json.Converters.IsoDateTimeConverter 的完全异常.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyProperty(属性, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)

在此处输入图片说明

使用这个转换器

var dateTimeConverter = new IsoDateTimeConverter
{
    Culture = CultureInfo.InvariantCulture,
    //note the "H" which accepts 24-hour format, whereas "h" only accepts 12-hour format and will fail for a time like "14:25"
    DateTimeFormat = "M/d/yy H:mm",  
    DateTimeStyles = DateTimeStyles.AssumeLocal
};

如果我这样做,效果很好

class AType {
    public DateTime aDate {get;set;}
}

...

var sett = new JsonSerializerSettings { Converters = new List<JsonConverter>{ dateTimeConverter}};
var d1 = new AType{ aDate = DateTime.Now};

var s = JsonConvert.SerializeObject(d1, sett);
var d2 = JsonConvert.DeserializeObject<AType>(s, sett);

您的转换器可能出现故障,因为M/d/yy h:mm无法处理14:25等 24 小时格式的时间,但h仅接受 12 小时格式。

你还应该检查这部分代码的确切输出

new JObject(
    row.Table.Columns
      .Cast<DataColumn>()
      .Select(c => new JProperty(c.ColumnName.Trim(), JToken.FromObject(row[c])))
    ).ToString(Formatting.None)

产生,因为那是进入转换器的东西。 如果此格式稍有偏差,转换器可能会抛出您所看到的错误。

此外,我不知道您项目的目的或背景。 但是强烈建议不要只使用两位数字表示年份。 如果您确切地知道自己在做什么,并且您永远不会有 1.1.2000 之前或 31.12.2099 之后的任何日期,那么您可以这样做。 但是,是的,我们去过那里一次(70 年代没有人考虑过他们的系统在 2000 年仍在运行),有些系统可能会在 19/1/38 3:14 再次出现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM