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

时间:2017-12-13 05:19:04

标签: java timestamp amazon-dynamodb

我必须在<View style={{ marginBottom: 20 }}> { this.props.addresses.map(addr => { return ( <View style={{ marginRight: 10 }} key={addr.label}> <View> <Text style={styles.labelTextStyle}>{addr.label}</Text> </View> </View> ); }) } </View> 中存储更新的时间,在查看dynamodb的文档时,如果我们以ISO 8601的格式存储它,我们可以构建索引。但在应用程序中我有dynamodb。我该如何转换它?

4 个答案:

答案 0 :(得分:4)

java.time

First answer, don’t use java.sql.Timestamp. This class is long outmoded. Get an Instant instead. Instant is one of the classes in java.time, the modern Java date and time API also known as JSR 310. This API is so much nicer to work with than the old classes. Assuming inst is your Instant:

    String iso8601String = inst.toString();
    System.out.println(iso8601String);

On my computer this just printed

2017-12-13T11:04:59.282Z

The toString methods of the modern classes produce ISO 8601 format, which makes your task very easy.

Convert your Timestamp

Since (as I understand) you get your Timestamp object from legacy code that you cannot afford to upgrade just now: The first thing to do is to convert it to an Instant. Then you may proceed as above.

I assume that ts is your timestamp. If you are using Java 8 or later:

    String iso8601String = ts.toInstant().toString();

If you are using Java 6 or 7, you will need to get the ThreeTen Backport (link below). This is the backport of JSR 310 to the mentioned Java versions. Since in these versions, the conversion method isn’t built into the Timestamp class, the conversion happens a little differently, everything else is the same. I have not tested the following code line, so please bear with any typo.

    String iso8601String = DateTimeUtils.toInstant(ts).toString();

Links

答案 1 :(得分:2)

DyanmoDB本身是无模式的(你不预先定义非关键属性类型)和它and does not recognise date as a type.。您可以在Dynamo中使用String来存储日期

  

您可以使用字符串数据类型来表示日期或时间戳。   一种方法是使用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)

     

很长很长

     

Integer,int

     

加倍,双重

     

漂浮,漂浮

     

的BigDecimal

     

的BigInteger

因此,您可以使用DynamoDBMapper之类的东西来编组代码中的日期和数据库中的字符串之间的数据,或者您可以自己执行此操作。在任何一种情况下,DynamoDB中的数据只是字符串,您的索引按字符串排序。使用ISO 8601格式只是意味着您的字符串是自然排序的。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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