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
我知道这是一个非常常见的问题,但我无法找到一个特定的方案。
答案 0 :(得分:2)
如果您知道所有可能的传入日期格式,则可以为每个格式创建一个SimpleDateFormat
实例。然后,对于每个传入的日期字符串,您只需在列表中运行它。如果格式不解析此字符串,它将抛出异常,捕获它并继续下一格式,冲洗并重复,直到找到解析字符串的格式。
答案 1 :(得分:1)
无需破解任何随机格式的神奇方法。但在您的情况下,您可以轻松识别每种特定格式。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。