C# JSON.NET:String';20年7月1日14:15';未识别为有效的日期时间
我无法使用EPPlus从Excel反序列化日期时间字符串。我已经阅读了关于此问题的其他答案,但仍然无法解决此问题,并得到错误:字符串'M-d-yy hh:mm'未被识别为有效的日期时间 根据在这个主题上找到的其他答案,我已经将DateTimeFormat更改为“M/d/yy hh:mm”,这是我在EPPlus上放手表时返回的字符串。我目前的文化是“en UK”,但我使用的是不变量文化,因为EPPlus推出了我更愿意使用的上述格式。如果这是一个问题,那么我不介意更改它,但我不认为从美国格式更改为英国格式有什么意义,只是因为它在DB中再次更改为国际ISO格式 它一定仍然认为它遵循了英国的datetime格式,但我看不出哪里出了问题。任何帮助都将不胜感激!谢谢 以下是我目前的情况:C# JSON.NET:String';20年7月1日14:15';未识别为有效的日期时间,c#,datetime,json.net,2-digit-year,y2k,C#,Datetime,Json.net,2 Digit Year,Y2k,我无法使用EPPlus从Excel反序列化日期时间字符串。我已经阅读了关于此问题的其他答案,但仍然无法解决此问题,并得到错误:字符串'M-d-yy hh:mm'未被识别为有效的日期时间 根据在这个主题上找到的其他答案,我已经将DateTimeFormat更改为“M/d/yy hh:mm”,这是我在EPPlus上放手表时返回的字符串。我目前的文化是“en UK”,但我使用的是不变量文化,因为EPPlus推出了我更愿意使用的上述格式。如果这是一个问题,那么我不介意更改它,但我不认为从美国格式更改为英
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 }
})
);
}
var dateTimeConverter=新的IsoDateTimeConverter
{
Culture=CultureInfo.InvariantCulture,
DateTimeFormat=“M/d/yy h:mm”,
DateTimeStyles=DateTimeStyles.AssumeLocal
};
var excelImportResponse=新的excelImportResponse();
foreach(dataTable.AsEnumerable()中的DataRow行)
{
excelImportResponse.Objects.Add(
JsonConvert.DeserializeObject(
新作业项目(
row.Table.Columns
.Cast()
.Select(c=>newjproperty(c.ColumnName.Trim(),JToken.FromObject(行[c]))
)
.ToString(格式化为.None),
新JsonSerializerSettings
{
Error=委托(对象发送方,Newtonsoft.Json.Serialization.ErrorEventArgs args args)
{
excelImportResponse.Errors.Add(args.ErrorContext.Error.Message);
args.ErrorContext.Handled=true;
},
转换器={dateTimeConverter}
})
);
}
错误:
字符串“7/1/20 14:15”未被识别为有效的日期时间
完全例外
在System.DateTimeParse.ParseExact(ReadOnlySpan1s,ReadOnlySpan
1格式,DateTimeFormatInfo dtfi,DateTimeStyles样式)
在System.DateTime.ParseExact(字符串s、字符串格式、IFormatProvider提供程序、DateTimeStyles样式)
位于Newtonsoft.Json.Converters.IsoDateTimeConverter.ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter转换器、JsonReader读取器、类型objectType、对象existingValue)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty属性、JsonConverter属性转换程序、JsonContainerContract容器合同、JsonProperty容器属性、JsonReader阅读器、对象目标)
位于Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(对象newObject、JsonReader、JSONObject合同、JsonProperty成员、字符串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);
产生,因为这就是进入转换器的东西。如果这种格式有点不正确,转换器可能会抛出您看到的错误
此外,我不知道你的项目的目的或背景。但是,强烈反对在年度中只使用两位数。如果您确实知道自己在做什么,并且在2000年1月1日之前或2099年12月31日之后,您永远不会有任何日期,您可以这样做。但是,是的,我们曾经去过那里(70年代没有人想到他们的系统在2000年仍在运行),一些系统可能会在19/1/38 3:14再次使用此转换器
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);
产生,因为这就是进入转换器的东西。如果这种格式有点不正确,转换器可能会抛出您看到的错误
此外,我不知道你的项目的目的或背景。但是,强烈反对在年度中只使用两位数。如果您确实知道自己在做什么,并且在2000年1月1日之前或2099年12月31日之后,您永远不会有任何日期,您可以这样做。但是,是的,我们曾经去过那里(70年代没有人想到他们的系统在2000年仍在运行),有些系统可能会在38年1月19日3:14再次出现,评论不供讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。没有办法避免两位数年份的问题。今年,因为
20
被解读为1920年——劳埃德、哈利法克斯和苏格兰银行。在JSON中使用非标准日期格式是一个非常糟糕的开始with@PanagiotisKanavos关于y2k,你是对的,OP已经多次被警告过了。但归根结底,这是他的决定,他如何处理警告。OP所看到的错误与y2k无关,但自定义日期时间转换器不接受24小时格式。无法避免2位数年份的问题。今年,因为20
被解读为1920年——劳埃德、哈利法克斯和苏格兰银行。在JSON中使用非标准日期格式是一个非常糟糕的开始with@PanagiotisKanavos关于y2k,你是对的,OP已经多次被警告过了。但归根结底,这是他的决定,他如何处理警告。OP看到的错误与y2k无关,而是与自定义日期有关