在DynamoDB中处理Java8日期和时间的最佳方法

时间:2017-11-10 08:28:28

标签: amazon-dynamodb java-time

我研究了使用Java SDK存储日期和时间的DynamoDB选项。据我所知,Java8 LocalDate和LocalDateTime需要自定义转换器,而对于旧的Date,Calendar和Joda time LocalDateTime,有一些注释。

根据文档,@ DynamoDBTypeConvertedTimestamp支持标准的日期类型转换,例如java.util.Calendar,Long。 @DynamoDBTypeConvertedEpochDate可用于将Date,Calendar和org.joda.time.DateTime转换为数值。

同时,如果我没有在Date字段上添加任何注释,它就会像保存@DynamoDBTypeConvertedTimestamp一样保存,甚至范围查询也能成功运行。

是否有人知道解释不同的可能方法,并就从DynamoDB存储和检索Java日期和时间对象的最佳方法发表意见?

2 个答案:

答案 0 :(得分:1)

TLDR;这取决于日期,时间等的使用方式。

长答案

这将取决于您的用例,因此没有一成不变的“最佳”方法。但是,要记住一些注意事项。

表架构中的值如何使用?

如果将Java 8日期/时间用作排序键,请考虑使用将其转换为字符串的自定义转换器。如果执行此操作,则可以在查询的关键条件表达式中使用begins_with运算符,例如begins_with(myDate, "2018-12")。如果您要搜索特定年,月,日,小时等中的所有内容,能够进行这样的查询将使您的代码更加简单。

如果您将该值用作DynamoDB TTL属性,则必须将其转换为数字时间戳。这是使用TTL功能的要求。

我们在谈论java.time类中的哪一个?

Some of the classes in the java.time package并不自然地转换为数字。例如,LocalDate充其量只能转换为数字。将LocalDate 2018-12-10转换为20181210最为有意义,但是到那时,您必须编写足够的代码,以至于只能使用内置的LocalDate.toString()和{ {1}}。

您必须多久查看一次数据库以查找错误或修复不良数据?

如果您经常在数据库中弄乱(希望不是这种情况),请使用人类可读的内容。在深夜传呼时,没人希望弄清楚LocalDate.parse()是在2018-12-05T17:23:19.483+08:30之前还是之后。

您的应用程序对增加的延迟有多敏感?

我还没有观察到与DynamoDB在将日期存储为字符串与数字有关的任何可测量的性能差异。但是,string parsing is slower that using a number将创建一个1544572463对象,因此,如果将日期存储为字符串,则对您的应用程序可能会有轻微的影响。

不允许自定义转换器将您吓倒

使用java.time API编写起来非常容易。这是为java.time实现一个转换为LocalDateTime的转换器的方法。

String

答案 1 :(得分:0)

尝试使用@DynamoDBTyped注释日期字段,这是一个覆盖dynamoDB中标准属性类型绑定的注释。因此它将转换为Attribute Type = S的日期,DynamoDM中为String。希望对您有帮助

@DynamoDBTyped(DynamoDBAttributeType.S)
private LocalDate startDate;