将java.sql.Timestamp转换为java.util.Calendar ISO 8601格式

5

我需要在 dynamodb 中存储更新时间,在查阅 dynamodb 文档时发现,如果我们以 ISO 8601 格式存储它,则可以构建索引。但是在应用程序中我使用的是 java.sql.timestamp。如何进行转换?


2
日期和时间戳没有固有的格式。考虑使用Java8类或SimpleDateFormat。 - Scary Wombat
@ScaryWombat 从我所了解的情况来看,这更像是一个DynamoDB问题。但即使在那里,日期也可能没有固有的格式。 - Tim Biegeleisen
2
为什么你有一个 java.sql.Timestamp 对象?这个类(连同 CalendarDate 及其相关类)早已过时。如果可以的话,我建议您使用 java.time.Instant 代替。java.time 是现代 Java 的日期和时间 API,与旧类相比更易于使用。 - Ole V.V.
1
处理一些旧代码并对其进行更改将要求我在其他地方也进行更改。 - pannu
显示剩余2条评论
4个回答

8

java.time

首先,不要使用java.sql.Timestamp类,这个类已经过时了。改用Instant类。 Instantjava.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();

如果你正在使用 Java 6 或 7,你需要获取 ThreeTen Backport(下面的链接)。这是将 JSR 310 移植到所述 Java 版本的后移植版本。由于在这些版本中,转换方法没有内置到 Timestamp 类中,因此转换会稍微有些不同,其他都相同。我还没有测试过以下代码行,请容忍任何打字错误。
    String iso8601String = DateTimeUtils.toInstant(ts).toString();

链接


4
您可以在java.sql.timestamp上调用.toInstant().toString(),以获取一个 ISO-8601 时间字符串。

2
DyanmoDB本身是无模式的(您不需要预先定义非键属性类型),并且不将日期识别为一种类型。您可以在Dynamo中使用String来存储日期。

您可以使用字符串数据类型表示日期或时间戳。一种方法是使用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格式只是意味着您的字符串被自然排序。

2

我不确定你是否必须在这里进行任何繁重的手动操作,因为我认为一个好的驱动程序应该能够处理这个问题。假设您确实需要将 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;
}

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