![](/img/trans.png)
[英]String was not recognized as a valid DateTime when string is 13/07/15
[英]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.