我需要在 dynamodb
中存储更新时间,在查阅 dynamodb
文档时发现,如果我们以 ISO 8601 格式存储它,则可以构建索引。但是在应用程序中我使用的是 java.sql.timestamp
。如何进行转换?
我需要在 dynamodb
中存储更新时间,在查阅 dynamodb
文档时发现,如果我们以 ISO 8601 格式存储它,则可以构建索引。但是在应用程序中我使用的是 java.sql.timestamp
。如何进行转换?
java.time
首先,不要使用java.sql.Timestamp
类,这个类已经过时了。改用Instant
类。 Instant
是java.time
中的一种类,也称为JSR 310,这是现代Java日期和时间API。与旧类相比,这个API更加易于操作。假设inst
是您的Instant
:
String iso8601String = inst.toString();
System.out.println(iso8601String);
2017-12-13T11:04:59.282Z
toString
方法会生成ISO 8601格式,这使得您的任务非常容易。Timestamp
对象:首先要做的是将其转换为Instant
。然后您可以按上述方式继续操作。ts
是您的时间戳。如果您使用的是Java 8或更高版本: String iso8601String = ts.toInstant().toString();
Timestamp
类中,因此转换会稍微有些不同,其他都相同。我还没有测试过以下代码行,请容忍任何打字错误。 String iso8601String = DateTimeUtils.toInstant(ts).toString();
链接
java.sql.timestamp
上调用.toInstant().toString()
,以获取一个 ISO-8601 时间字符串。您可以使用字符串数据类型表示日期或时间戳。一种方法是使用ISO 8601字符串,如以下示例所示:
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
如果您正在使用对象建模库,例如DynamoDBMapper,它将代表您进行某些类型编组。例如,DynamoDBMapper处理许多Java数据类型,包括
本节描述了支持的原始Java数据类型、集合和任意数据类型。DynamoDB支持以下原始数据类型和原始包装类:字符串、布尔值、字节、日期(作为ISO_8601毫秒精度字符串,转换为UTC)、日历(作为ISO_8601毫秒精度字符串,转换为UTC)、长整型、整型、双精度浮点型、单精度浮点型、BigDecimal和BigInteger。因此,您可以使用类似DynamoDBMapper的工具在代码中的日期和数据库中的字符串之间进行数据转换,或者自己实现这个过程。无论哪种情况,DynamoDB中的数据都只是字符串,并且您的索引按照字符串顺序排序。使用ISO 8601格式只是意味着您的字符串被自然排序。我不确定你是否必须在这里进行任何繁重的手动操作,因为我认为一个好的驱动程序应该能够处理这个问题。假设您确实需要将 java.sql.timestamp
手动转换为符合ISO 8601标准的字符串,您可以尝试以下方法:
public String getISOTimestamp(java.sql.timestamp ts) {
Date date = new Date(ts.getTime());
String pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
String isoTS = sdf.format(date);
return isoTS;
}
java.sql.Timestamp
对象?这个类(连同Calendar
、Date
及其相关类)早已过时。如果可以的话,我建议您使用java.time.Instant
代替。java.time
是现代 Java 的日期和时间 API,与旧类相比更易于使用。 - Ole V.V.