DynamoDB 无法转换为 System.DateTime
Posted
技术标签:
【中文标题】DynamoDB 无法转换为 System.DateTime【英文标题】:DynamoDB Can't Convert to System.DateTime 【发布时间】:2019-05-19 16:51:24 【问题描述】:我在我的应用程序中使用 C# 对象持久性模型,并从外部源填充表。我插入具有以下日期的行(在字符串列中):2018-12-12T22:27:14.73Z
。这是使用以下 Go 代码从时间戳生成的:
&dynamodb.AttributeValueS: aws.String(entity.TimeStamp.UTC().Format("2006-01-02T15:04:05.999Z"))
但是,DynamoDB 对象持久性模型在尝试将其转换为 System.DateTime
时出现阻塞,并出现以下错误:System.InvalidOperationException: Unable to convert [2018-12-12T22:27:14.73Z] of type Amazon.DynamoDBv2.DocumentModel.Primitive to System.DateTime
如果我让我的服务编写一个 System.DateTime(使用包含 DateTime 属性的 POCO),它看起来像这样:2018-12-19T07:45:36.431Z
。我错过了什么阻止 AWS 正确反序列化我的日期?看起来我写的格式和亚马逊写的一样?
【问题讨论】:
见这里:***.com/questions/40561484/… @JohnB 它们已经在我的表中表示为字符串;不管我的 C# 或 Go 代码是在那里写的。我的问题与为什么我似乎无法让他们退出有关。 阅读他们所说的应该如何使用using ISO 8601
字符串进行格式化
那是你的问题...格式不兼容
它们是 ISO 8601 字符串,请参阅我的问题中的示例。比较链接帖子中的这个例子:2015-12-21T17:42:34Z
和我的:2018-12-19T07:45:36.431Z
。唯一的区别是我有小数秒,这似乎在规范之内?由 C# Dynamo 库编写的还包括小数秒,所以我认为它是正确且预期的格式。
【参考方案1】:
好的,我找到了答案。 DynamoDB 期望该列始终在时间戳的小数部分具有 3 位精度。当我从 Golang 格式化时间时,我使用 "2006-01-02T15:04:05.999Z"
作为我的格式字符串,但这会导致 time.Format
截断尾随零(如果它们存在)。将我的时间格式字符串更改为 always 打印完整的精度,我能够解决我的问题。
也就是说,文档可能会更清楚地说明这一精度要求。或者异常可能更明确一点。希望这个问题/答案可以在 Google 上搜索到该异常!
【讨论】:
以上是关于DynamoDB 无法转换为 System.DateTime的主要内容,如果未能解决你的问题,请参考以下文章
AWS DynamoDB - 转换器类 - “错误请求,无法解析JSON”