【发布时间】:2018-01-24 10:42:39
【问题描述】:
String str = "2017-08-01T15:15:03.313456768+02:00";
// The following statement gives IllegalArgumentExceptionTimestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
Timestamp timeStamp = Timestamp.valueOf(str);
ZonedDateTime zoneddate = ZonedDateTime.parse(str);
System.out.println("ZonedDate: "+zoneddate);// prints 2017-08-01T15:15:03.313456768+02:00
Instant inst = zoneddate.toInstant();
Timestamp newTime = Timestamp.from(inst);
System.out.println("Timestamp: "+newTime);// prints 2017-08-01 15:15:03.313456768 without Zone
我在转换期间缺少区域。谁能建议我如何在TimeStamp 中获得区域?
【问题讨论】:
-
我已经红了,但 SimpleDateFormat 不接受 9 位毫秒。
-
SimpleDateFormat具有毫秒精度(小数点后只有 3 位)。对于 3 位以上的数字,您必须使用 Java 8 新的java.timeAPI:stackoverflow.com/questions/30135025/… -
该区域没有丢失。
Timestamp只是保持自1970-01-01T00:00Z以来的纳秒数,它没有时区。当你打印它时,toString()方法被隐式调用,并且这个方法将值调整为 JVM 默认时区(检查TimeZone.getDefault()的值,你可能在当前偏移量为+02:00的区域中) .您所做的转换是正确的,您可以使用zoneddate.toInstant().equals(newTime.toInstant())(它将是true)进行检查。而且也可以认为是this的复制品 -
每个数据库对时间戳/日期类型的工作方式不同,您必须在各自的文档中查看如何操作、如何保留时区信息、如何不丢失精度等。而且您还误认为 value(自
1970-01-01T00:00Z以来的纳秒数)与 representation(显示日/月/年/小时/分钟/等的值一些特定的区域)。存储的 值 通常是相同的(纳秒数)。在向用户显示此值时,您选择一种格式(此值的表示)。而且这种格式可以有也可以没有。 -
我推荐this article - 它谈到
java.util.Date,但Timestamp是相似的(实际上它扩展了Date),所以所有概念都适用于两者。
标签: java timestamp datetime-parsing