我们的客户会向我们发送包含时间戳字符串的请求:
"2013-10-27T13:00:00.325234Z"
。我将用它来比较oracle数据库中的时间戳。
如何将上面的String转换为java.sql.Timestamp?
我可以将它转换为Date,但Date只有毫秒精度。
应保持微秒和时区。 提前谢谢。
答案 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)
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));
将ThreeTen Backport添加到您的项目中(链接如下)。使用以下导入。
import org.threeten.bp.DateTimeUtils;
import org.threeten.bp.Instant;
然后做:
Instant inst = Instant.parse(timestampString);
Timestamp ts = DateTimeUtils.toSqlTimestamp(inst);
java.time
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。答案 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