在Java中将任何传入日期格式转换为标准格式

时间:2017-04-26 20:30:31

标签: java

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 我知道这是一个非常常见的问题,但我无法找到一个特定的方案。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用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.DateCalendar和& SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

相关问题