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:无法取消转换属性错误

AWS DynamoDB - 转换器类 - “错误请求,无法解析JSON”

将拼花地板转换为json以进行dynamodb导入

您如何将 DynamoDB Map/List 类型转换为通过 AWS Pipeline 到 Redshift?

Dynamodb - 转换枚举器集合

Java 如何在 dynamodb 中存储 JSON 对象或 JSON 数组而不将其转换为字符串?