JSON.NET:字符串 '7/1/20 14:15' 未被识别为有效的 DateTime
Posted
技术标签:
【中文标题】JSON.NET:字符串 \'7/1/20 14:15\' 未被识别为有效的 DateTime【英文标题】:JSON.NET: String '7/1/20 14:15' was not recognized as a valid DateTimeJSON.NET:字符串 '7/1/20 14:15' 未被识别为有效的 DateTime 【发布时间】:2020-09-11 10:16:05 【问题描述】:我无法使用 EPPlus 从 Excel 中反序列化日期时间字符串。我已阅读有关此问题的其他答案,但仍然无法正常工作并收到错误消息:String 'M-d-yy hh:mm' was not Recognized as a valid 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
)
);
my code
错误: 字符串 '7/1/20 14:15' 未被识别为有效的 DateTime。
完全例外
在 System.DateTimeParse.ParseExact(ReadOnlySpan1 s, ReadOnlySpan
1 格式,DateTimeFormatInfo dtfi,DateTimeStyles 样式)
在 System.DateTime.ParseExact(String s,String 格式,IFormatProvider 提供程序,DateTimeStyles 样式)
在 Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(JsonReader 阅读器,Type objectType,Object existingValue,JsonSerializer 序列化程序)
在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter 转换器,JsonReader 阅读器,类型 objectType,对象现有值)
在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty 属性,JsonConverter propertyConverter,JsonContainerContract containerContract,JsonProperty containerProperty,JsonReader 阅读器,对象目标)
在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id)
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:使用这个转换器
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 再次出现
【讨论】:
无法避免 2 位数年份的问题。今年three major UK banks had to shut down 因为20
被解释为1920 - Lloyd's、Halifax 和苏格兰银行。在 JSON 中使用非标准日期格式是一个非常糟糕的主意
@PanagiotisKanavos 您对 y2k 的看法是正确的,并且 OP 已多次被警告过。但归根结底,他决定如何处理警告。并且 OP 看到的错误与 y2k 无关,而是与不接受 24 小时格式的自定义 DateTime 转换器有关。以上是关于JSON.NET:字符串 '7/1/20 14:15' 未被识别为有效的 DateTime的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 json.net 将数据表转换为 json 字符串?
为啥使用 Json.NET 序列化为 json 字符串时缺少 DriveInfo 的属性?