【问题标题】:Convert any incoming date format to standard format in Java将任何传入的日期格式转换为 Java 中的标准格式
【发布时间】:2017-04-27 05:22:36
【问题描述】:

Java 中是否有任何类可以将传入的日期转换为标准格式。我知道 SimpleDateFormat 确实将日期转换为特定格式,但我需要一种方法可以实际将以下所有日期转换为格式这是 YYYY-MM-DD_HH:MM:SS_inputstring:

输入

20170112_125645
20170915 137546
09122017:135292
2014012014132390 -- milliseconds in here

输出

YYYY-MM-DD_HH:MM:SS_inputstring

我们希望输入多种格式的日期值,应将其转换为YYYY-MM-DD_HH:MM:SS_inputstring 我知道这是一个非常常见的问题,但我找不到一个特定于我的场景的问题。

【问题讨论】:

  • 所以你想要一些魔法课???我看不出如何自动解析 2014012014132390
  • 任何格式?不会。但是有几个实用程序可以从一组格式中解析。
  • “Java 中有没有类可以...” 是的,有,当你写的时候。
  • 787546 应该是什么时间? --- 仅通过查看值来区分 ddMMyyyyMMddyyyy 是不可能的,因此您永远无法处理 any 格式。

标签: java


【解决方案1】:

如果您知道所有可能的传入日期格式,则可以为每个格式创建一个 SimpleDateFormat 实例。然后对于每个传入的日期字符串,您只需在列表中运行它。如果一个格式不能解析这个字符串,它会抛出一个异常,捕获它并移动到下一个格式,冲洗并重复,直到你得到一个解析字符串的格式。

【讨论】:

【解决方案2】:

使用 java.time

没有破解任何随机格式的神奇方法。但在您的情况下,您可以轻松地识别每种特定格式。

DateTimeFormatter f ;
if ( input.contains( "_" ) ) {  // 20170112_125645
    f = DateTimeFormatter.ofPattern( "uuuuMMdd'_'HH:mm:ss" );

} else if ( input.contains( " " ) ) {  // 20170915 137546
    f = DateTimeFormatter.ofPattern( "uuuuMMdd' 'HH:mm:ss" );

} else if ( input.contains( ":" ) ) {  // 09122017:135292
    f = DateTimeFormatter.ofPattern( "ddMMuuuu':'HH:mm:ss" );

} else if ( input.length() == 16 ) {  // 2014012014132390
    f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmssSS" );

} else {
    … // Handle error condition
    System.out.println( "ERROR - Unexpected input: " + input ) ;

}

LocalDateTime ldt = LocalDateTime.parse( input , f );

当然,在经常被多次调用的实际代码中,我会缓存那些DateTimeFormatter 实例,而不是每次都实例化。如果在代码库中的其他各个地方使用,也许可以定义一个 Enum

通常我建议始终在格式化程序中指定 Locale,而不是隐式依赖 JVM 的当前默认值。但在这里我不认为语言环境有任何影响。

避免使用旧的日期时间类

你提到了SimpleDateFormat。该类是应该避免的麻烦的旧日期时间类之一。现在是遗留的,被 java.time 类所取代。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多