代码之家  ›  专栏  ›  技术社区  ›  Christian Strempfer

无法分析自定义日期格式。(爪哇)

  •  9
  • Christian Strempfer  · 技术社区  · 14 年前

    我必须使用Java中的自定义日期格式。它包含微秒,虽然Java不提供对微秒的支持。因此,我在时间模式中填充了零,这在格式化时可以很好地工作,但是我不能用该模式解析日期字符串。

    是否有一个简单的解决方法,或者我必须自己处理微秒(使用字符串函数)?

    @Test
    public void testDateFormat() throws ParseException {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSS000");
        String theDate = format.format(new Date());
        // this will fail:
        format.parse(theDate);
    }
    

    java.text.parseException:不可解析日期:“2010-01-25-12.40.35.769000”

    4 回复  |  直到 7 年前
        1
  •  12
  •   jarnbjo    14 年前

    不幸的是,simpledateformat中使用的模式具有不同的含义,这取决于它是用作解析器还是格式化程序。作为一个格式化程序,您的模式按预期执行,输出将以毫秒值结尾,毫秒值格式为三位数字,后跟三个0字符,例如:

    2010年1月25日-14.17.47.307000

    但是,作为解析器,“sss”模式将匹配任意数目的数字,并将上述示例解析为307000 ms。解析ms字段后,解析器仍将查找“000”子字符串,并且会异常失败,因为您已经到达输入字符串的末尾,而没有满足模式的要求。

    由于simpledateformat中的μs值没有模式,因此在将其输入simpledateformat之前,必须编写自己的包装器来除去最后三个0字符的输入字符串。

        2
  •  3
  •   Stephen Denne    14 年前

    除了jarnbjo的答案之外,如果需要微秒,您还可以使用java.sql.timestamp:

    Date dateToMillis = format.parse(theDate.substring(0, 23));
    DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    Timestamp timestamp = Timestamp.valueOf(timestampFormat.format(dateToMillis) + theDate.substring(23,26));
    
        3
  •  1
  •   Basil Bourque    7 年前

    DR

    LocalDateTime.parse( 
        "2010-01-25-12.40.35.769000" ,
        DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) 
    )
    

    使用JavaTimes

    您正在使用麻烦的旧日期时间类,这些类现在是遗留的,由java.time类取代。

    这些老班只限于跟踪 milliseconds ,小数点后三位。现代java.time类决心 nanoseconds ,用于 小数位数。

    DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd-HH.mm.ss.SSSSSS" ) ;
    LocalDateTime ldt = LocalDateTime.parse( "2010-01-25-12.40.35.769000" );
    

    ldt.toString():2010-01-25t12:40:35.769

    国际标准化组织8601

    提示:不要发明自己的格式来以文本形式表示日期时间值,而要遵循标准 ISO 8601 格式。

    默认情况下,java.time类使用标准格式。您可以在上面的输出中看到这种格式。这个 T 将日期部分与时间部分分开。


    关于JavaTimes

    这个 java.time 框架是在Java 8和之后构建的。这些阶级取代了麻烦的旧阶级。 legacy 日期时间类,如 java.util.Date , Calendar 和; SimpleDateFormat .

    这个 Joda-Time 项目,现在 maintenance mode ,建议迁移到 Java.时间 课程。

    要了解更多信息,请参阅 Oracle Tutorial . 以及搜索堆栈溢出以获得许多示例和解释。规格为 JSR 310 .

    在哪里获取java.time类?

    这个 ThreeTen-Extra Project使用其他类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和 more .

        4
  •  0
  •   laura    14 年前

    添加一个 '' 围绕零,就像这样: "yyyy-MM-dd-HH.mm.ss.SSS'000'"

    日期和时间格式由 日期和时间模式字符串。内 日期和时间模式字符串, 从“A”到“Z”的未加引号的字母以及 从“a”到“z”解释为 代表 日期或时间字符串的组件。 文本可以用单引号引起来 (')以避免解释。“” 表示单引号。所有其他 不解释字符; 它们被简单地复制到输出中 格式化或匹配时的字符串 在 解析。