DynamoDB 无法转换为 System.DateTime

8

我在我的应用程序中使用C#对象持久化模型,并从外部来源填充表格。我插入了一行,其中包含以下日期(在字符串列中):2018-12-12T22:27:14.73Z。这是使用以下Go代码从时间戳生成的:

&dynamodb.AttributeValue{S: aws.String(entity.TimeStamp.UTC().Format("2006-01-02T15:04:05.999Z"))}

然而,当尝试将其转换为System.DateTime时,DynamoDB对象持久性模型出现错误,错误如下: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正确反序列化我的日期?它看起来我正在以Amazon编写它们相同的格式书写它们?


请问在DynamoDB中,时间戳应该使用哪种数据类型? - jazb
@JohnB,它们已经作为字符串在我的表中表示了;无论是我的 C# 还是 Go 代码将它们写入那里。我的问题与为什么我似乎无法将它们取回有关。 - Corey Larson
阅读如何使用“使用ISO 8601字符串格式化”的方式进行格式化。 - jazb
那就是你的问题所在...格式不兼容。 - jazb
1
它们是ISO 8601字符串,在我的问题中可以看到示例。将此链接帖子中的示例:2015-12-21T17:42:34Z与我的示例进行比较:2018-12-19T07:45:36.431Z。唯一的区别是我有小数秒,这似乎在规范内?由C# Dynamo Library编写的字符串也包括小数秒,因此我认为这是正确和预期的格式。 - Corey Larson
1个回答

18

好的,我找到了答案。DynamoDB希望时间戳中的小数部分始终保留3位精度。当我从Golang格式化时间时,我使用"2006-01-02T15:04:05.999Z"作为我的格式字符串,但这会导致time.Format在存在尾随零时截断它们。将我的时间格式字符串更改为始终打印完整精度,我能够解决我的问题。

话虽如此,文档可以更清楚地说明这种精度要求。或者异常可以更明确一些。希望这个问题/答案能让这个异常在谷歌上搜索到!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接