【发布时间】:2018-10-29 15:47:58
【问题描述】:
我在 Oracle SQL 中遇到了这个奇怪的时间戳到日期转换问题。
SQL 语句如下:
String INSERT_SQL = String.format("INSERT INTO AUDIT_TASK (%s, %s, %s, %s) VALUES (AUDIT_TASK_SEQ.nextval,?,?,?)",ID,CLASS_NAME,TASK_STEP_TIMESTAMP,OPERATOR);
java.util.Calendar utcCalendarInstance = Calendar.getInstance(TimeZone .getTimeZone("UTC"));
java.util.Calendar cal = Calendar.getInstance();
final PreparedStatement stmt = con.prepareStatement(INSERT_SQL);
stmt.setString(1, audit.getClassName().getValue());
// Save the timestamp in UTC
stmt.setTimestamp(2,new Timestamp(cal.getTimeInMillis()), utcCalendarInstance);
当我执行此语句时,虽然大多数时候 creation_date 和 task_step_timestamp 日期是相同的,但有时我会生成带有一些虚假日期的 task_step_timestamp - 例如“25-APR-0000”或“00-Jan-0001”等等
- ID |创建日期 | Task_step_timestamp
- 1 |2018 年 4 月 27 日 17:58:53| 25-APR-0000 09:00:45
- 2 |2018 年 4 月 27 日 18:06:25| 00-Jan-0001 09:18:25
Oracle DB中task_step_timestamp列的数据类型为'DATE'。
有人能指出时间戳到日期转换不一致的原因吗?
【问题讨论】:
-
Calendar和Timestamp类已过时。java.time, the modern Java date and time API, 使用起来更好。看看然后尝试例如stmt.setObject(2, Instant.now());。
标签: java sql oracle11g sql-date-functions sql-timestamp