在Java中将字符串转换为时间戳

时间:2015-04-09 10:17:48

标签: java

我们的客户会向我们发送包含时间戳字符串的请求: "2013-10-27T13:00:00.325234Z"。我将用它来比较oracle数据库中的时间戳。

如何将上面的String转换为java.sql.Timestamp?

我可以将它转换为Date,但Date只有毫秒精度。

应保持微秒和时区。 提前谢谢。

6 个答案:

答案 0 :(得分:6)

除了中间的T和最后的Z,你可以把它传递给Timestamp.valueOf(String)

所以你可以拥有:

String line = "2013-10-27T13:00:00.325234Z";
Timestamp ts = Timestamp.valueOf(line.replace("T"," ").replace("Z",""));

这给出了时间戳匹配

2013-10-27 13:00:00.325234

答案 1 :(得分:3)

Java 8

    String timestampString = "2013-10-27T13:00:00.325234Z";
    Instant inst = Instant.parse(timestampString);

如果可以避免,请不要使用Timestamp课程。要保存字符串中的时间戳,只需使用Instant方法将PreparedStatement传递给setObject即可。它需要JDBC 4.2或更高版本。你可能已经拥有了,或者你应该能够获得这样的驱动程序。您也可以将Instant传递给现代JPA实现。

解析在没有任何显式格式化程序的情况下工作,因为您的字符串是ISO 8601格式,现代java日期和时间类解析(并且还打印)的格式是默认格式。

Timestamp课程已经过时了。如果您仍然需要Timestamp,例如对于您无法更改或不想立即更改的旧版API,转换很容易:

    Timestamp ts = Timestamp.from(Instant.parse(timestampString));

Java 6和7

将ThreeTen Backport添加到您的项目中(链接如下)。使用以下导入。

import org.threeten.bp.DateTimeUtils;
import org.threeten.bp.Instant;

然后做:

    Instant inst = Instant.parse(timestampString);
    Timestamp ts = DateTimeUtils.toSqlTimestamp(inst);

链接

答案 2 :(得分:2)

这是一个Java 8解决方案。它依赖于java.time库。

String isoStamp = "2013-10-27T13:00:00.325234Z";
OffsetDateTime odt = OffsetDateTime.parse(
                             isoStamp,
                             DateTimeFormatter.ISO_OFFSET_DATE_TIME );

OffsetDateTime是一个日期时间对象,其精度为纳秒,包括与UTC的偏移量。 ISO_OFFSET_DATE_TIME是一种标准的DateTimeFormatter格式,可以理解Z指定,并将其设置为与UTC的偏移量0。

下一步是在JDBC中使用它,Oracle在this article中说java.time对象应该与setObject()方法一起使用(而不是setTimeStamp()) 。 E.g。

stmt.setObject( 1, odt, JDBCType.TIMESTAMP_WITH_TIMEZONE );

请注意,这可能取决于数据库和JDBC驱动程序,当然这应该是最新的。

答案 3 :(得分:0)

对我来说,String格式不是yyyy-MM-dd HH:mm:ss.SSSSSS。所以Timestamp.valueOf没有用。所以,我确实喜欢这个

String s = "2017-12-29-05.04.18.104071";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss");//Yes, it works without .SSSSSS
Timestamp ts = new Timestamp(sdf.parse(s).getTime());
ts.setNanos(Integer.valueOf(s.substring(20)) * 1000);
System.out.println(ts.toString());

答案 4 :(得分:-1)

您在SimpleDateformat中定义了哪种格式,将其转换为日期,然后将其转换为时间戳。

public static Timestamp stringToTimeStamp(String strTime){
    Timestamp tempTimestamp = null;
    if(strTime!=null && !strTime.equals(""))
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "yyyy-MM-dd");//format of date and time you have

        Date parsedTimeStamp = null;
        try {
            parsedTimeStamp = dateFormat.parse(strTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        tempTimestamp = new Timestamp(parsedTimeStamp.getTime());


    }
    return tempTimestamp;
}

答案 5 :(得分:-1)

[使用Java8]如果格式是严格指定的并且您需要一个强大的解决方案,请使用java.time.DateTimeFormatter将日期解析为java.time.LocalDateTime,处理几秒到纳米的秒数,然后您就可以创建java.sql.Timestamp

public static void main(String[] args) throws ParseException {
    String line = "2013-10-27T13:00:00.325234Z";
    DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
    LocalDateTime time = LocalDateTime.parse(line, dateFormat);
    Timestamp ts = Timestamp.valueOf(time);
    System.out.println(ts);
}

打印

  

2013-10-27 13:00:00.325234