使用非美国日期格式时,JsonConvert.DeserializeObject 无法将字符串转换为 DateTime

Posted

技术标签:

【中文标题】使用非美国日期格式时,JsonConvert.DeserializeObject 无法将字符串转换为 DateTime【英文标题】:JsonConvert.DeserializeObject could not convert string to DateTime when using non-us date formats 【发布时间】:2014-03-11 17:32:30 【问题描述】:

我有以下序列化的 json 对象:

"\"LineItems\":[\"LineID\":1,\"QuoteID\":\"00000000-0000-0000-0000-000000000000\",\"Quantity\":\"1\",\"UnitPriceExTax\":\"2\",\"UnitPriceTaxRate\":\"2\",\"UnitPriceTaxAmt\":0,\"LineTotalExTax\":2,\"LineTotalTaxAmt\":0.040000000000000036,\"LineTotalIncTax\":2.04],\"QuoteID\":[],\"CurrencyID\":\"2\",\"SupplierRef\":\"SDFSFSDF\",\"DeliveryDate\":\"22/02/2014\",\"QuoteAvailablityStartDate\":\"13/02/2014\",\"QuoteAvailablityEndDate\":\"09/02/2014\",\"OpeningComments\":\"WWSFSFS \",\"PricingComments\":\"XSDFSDF \",\"DeliveryComments\":\"SDFSFSDF SDFSFSF\",\"TermsComments\":\"SFSFSDF SDFSFSDF SDFS\",\"FreightExTax\":\"1\",\"FreightExTax2\":1,\"FreightTaxRate\":\"1\",\"FreightTaxAmt\":0.010000000000000009,\"FreightIncTax\":1.01,\"TotalLinesExTax\":2,\"TotalLinesTaxAmt\":0.040000000000000036,\"TotalExTax\":3,\"TotalTaxAmt\":0.050000000000000044,\"TotalIncTax\":3.05"

一个发送到我尝试反序列化的服务器,如下所示:

var json = Request.RequestContext.HttpContext.Request.Params["EoiDraftModel"];
var ld = JsonConvert.DeserializeObject<EoiDraftViewModel>(json);

我遇到了一个错误:

“无法将字符串转换为日期时间:2014 年 2 月 13 日。路径 'DeliveryDate',第 1 行,位置 323。”

由于日期有效,我假设它是非美国格式的问题。事实上,我知道这是因为如果我每天执行的次数少于 13 次,它就可以反序列化。那么如何指示反序列化器使用非美国日期呢?

【问题讨论】:

Deserializing dates with dd/mm/yyyy format using Json.Net 的可能重复项 【参考方案1】:

尝试使用IsoDateTimeConverter 专门指定DateTime 格式,并将其传递给JsonConvert.DeserializeObject&lt;&gt;() 方法。

...
var json = Request.RequestContext.HttpContext.Request.Params["EoiDraftModel"];

var format = "dd/MM/yyyy"; // your datetime format
var dateTimeConverter = new IsoDateTimeConverter  DateTimeFormat = format ;

var ld = JsonConvert.DeserializeObject<EoiDraftViewModel>(json, dateTimeConverter);
...

【讨论】:

谢谢!真的很有帮助! 非常有用的解决方案。

以上是关于使用非美国日期格式时,JsonConvert.DeserializeObject 无法将字符串转换为 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

DateTime.Parse 美国日期格式 C#

使用 jQuery datepicker 自定义日期格式验证(无法摆脱美国日期验证)

Bootstrap Datetimepicker 英国日期格式发布为美国格式

使用 VBA 在数据透视表中的两个日期之间进行过滤。英国到美国的日期格式问题

当我将 excel(dd/mm/yyyy) 中的日期格式导入 msaccess 时,它显示非日期值

将标准 rails / ruby​​ 时间转换为美国格式 - 日期混淆