Java 中的 JDBC 时间戳转义格式和 SimpleDateFormat

ejb*_*boy 3 java timestamp simpledateformat

我正在尝试提出SimpleDateFormat模式来解析和格式化 JDBC 时间戳,特别是以下格式的日期yyyy-mm-dd hh:mm:ss.fffffffff,其中ffffffffff表示纳秒。

不幸的是new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000000")不起作用,抛出以下异常:

java.text.ParseException: Format.parseObject(String) failed
Run Code Online (Sandbox Code Playgroud)

SimpleDateFormat 是否可以做到这一点,或者我必须创建一个 java.text.DateFormat 的自定义子类来处理这种情况?请注意,这不是关于如何yyyy-mm-dd hh:mm:ss.fffffffff在 Java 中解析字符串的问题,我对声明性方法感兴趣,即不需要额外修改输入字符串的 SimpleDateFormat 模式。

示例

我希望输入2012-02-05 17:00:34.427000000 被解析为 java.util.Date 其中毫秒部分是427

这是我迄今为止尝试过的格式列表,但由于各种原因它们都失败了:

  • new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000000") —— java.text.ParseException: Format.parseObject(String) failed
  • 这两个new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS", Locale.US)new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.US)-被解析为周五2月10日15时37分14秒,而不是预期的一个太阳2月5日17时00分34秒。(427000000的纳秒部分被视为毫秒,即使只指定了 SSS)

min*_*nus 5

我知道这是一个迟到的答案,但我一直在研究一个类似的问题,我遇到了这个问题。

这里的问题SimpleDateFormat是期待 a java.util.Date,它没有纳秒字段。所以,它不处理这种情况。该java.sql.Timestamp中的文件说,它是一个复合java.util.Date和纳秒场。的日期/时间值存储在对象的日期部分。这意味着可以忽略剩余的毫秒以支持纳秒字段。在我看来,这是一个糟糕的设计,因为它java.sql.Timestampjava.util.Date.

无论如何,为了回答这个问题,我认为在不附加到由SimpleDateFormat.

这是一种方法:

    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.");
    format.setTimeZone(TimeZone.getDefault()); // Set the TimeZone to whatever you are expecting.

    System.out.println(format.format(timestamp) + String.format("%09d", timestamp.getNanos());   
Run Code Online (Sandbox Code Playgroud)

编辑:

为纳秒字符串值添加了填充。