【问题标题】:Convert java.sql.Timestamp to java.util.Calendar ISO 8601 format将 java.sql.Timestamp 转换为 java.util.Calendar ISO 8601 格式
【发布时间】:2018-05-26 22:16:17
【问题描述】:

我必须将更新的时间存储在dynamodb,同时通过dynamodb的文档发现如果我们以ISO 8601的格式存储它可以建立一个索引。但在应用程序中我有java.sql.timestamp。如何转换?

【问题讨论】:

  • 日期和时间戳没有任何内在格式。考虑使用 java8 类或 SimpleDateFormat
  • @ScaryWombat 据我所知,这更像是一个 DynamoDB 问题。但即便如此,日期也可能没有内在格式。
  • 为什么你有一个java.sql.Timestamp 对象?该类(以及CalendarDate 和他们的朋友)早已过时。如果可以,我建议您改用java.time.Instantjava.time 是现代 Java 日期和时间 API,它比旧类更好用。
  • 使用一些遗留代码并对其进行更改需要我在其他地方进行更改

标签: java timestamp amazon-dynamodb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    java.time

    第一个答案,不要使用java.sql.Timestamp。这门课早就过时了。改为获取InstantInstantjava.time 中的类之一,现代 Java 日期和时间 API 也称为 JSR 310。这个 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();
    

    链接

    【讨论】:

      【解决方案3】:

      DyanmoDB 本身是无模式的(您没有预先定义非键属性类型)而且它and does not recognise date as a type.。您可以在 Dynamo 中使用字符串来存储日期

      您可以使用字符串数据类型来表示日期或时间戳。 一种方法是使用 ISO 8601 字符串,如下所示 例子:

      2016-02-15

      2015-12-21T17:42:34Z

      20150311T122706Z

      如果您使用的是对象建模库,例如DynamoDBMapper,它将代表您进行一些类型编组。例如DynamoDBMapper handles many Java data types including

      本节介绍支持的原始 Java 数据类型、集合和任意数据类型。

      DynamoDB 支持以下原始数据类型和原始包装类。

      字符串

      布尔值,布尔值

      字节,字节

      日期(作为 ISO_8601 毫秒精度字符串,转换为 UTC)

      日历(作为 ISO_8601 毫秒精度字符串,转换为 UTC)

      长长的

      整数,整数

      双倍,双倍

      浮动,浮动

      大十进制

      大整数

      因此,您可以使用 DynamoDBMapper 之类的工具在代码中的日期和数据库中的字符串之间编组数据,或者您可以自己执行此操作。无论哪种情况,DynamoDB 中的数据都只是 Strings,并且您的索引按字符串排序。使用 ISO 8601 格式只是意味着您的字符串是自然排序的。

      【讨论】:

        【解决方案4】:

        我不确定您是否必须在这里进行任何繁重的手动提升,因为我希望一个好的司机能够处理这个问题。假设您确实需要从 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;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-16
          • 1970-01-01
          • 2013-07-07
          相关资源
          最近更新 更多