线程中的格式化日期安全方式抛出java.text.ParseException:

时间:2012-12-11 08:43:53

标签: java multithreading parsing date

我正在尝试将日期从一种格式转换为另一种格式

输入字符串 - 2012-11-07-121603(yyyy-MM-dd-HH-mm-ss)

输出字符串 - 2012-11-07-12:16:03:000(yyyy-MM-dd-HH:mm:ss:SSS)

ThreadSafeSimpleDateFormatUtil simpleDateFormat = new ThreadSafeSimpleDateFormatUtil(GenericConstants.DATE_FORMAT.YYYY_MM_DD_HH_MM_SS.toString());
final Date parsedDate = simpleDateFormat.parse(bulkCollectionTime);
simpleDateFormat = new ThreadSafeSimpleDateFormatUtil(GenericConstants.DATE_FORMAT.YYYY_MM_DD_HH_MM_SS_SSS.toString());
writeBean.setTimestamp(simpleDateFormat.format(parsedDate));

但它低于错误:

java.text.ParseException: Unparseable date: "2012-11-07-121603"
    at java.text.DateFormat.parse(DateFormat.java:337)
    at com.belgacom.rosy.rebecca.utils.ThreadSafeSimpleDateFormatUtil.parse(ThreadSafeSimpleDateFormatUtil.java:39)

3 个答案:

答案 0 :(得分:2)

看起来输入格式应该在小时,分钟和秒之间没有“ - ”:

2012-11-07-121603 (yyyy-MM-dd-HHmmss)

答案 1 :(得分:1)

Input String - 2012-11-07-121603 (yyyy-MM-dd-HH-mm-ss)

yyyy-MM-dd-HHmmss匹配的错误模式。

答案 2 :(得分:0)

TL;博士

LocalDateTime.parse( 
    "2012-11-07-121603" ,
    DateTimeFormatter.ofPattern( "uuu-MM-dd-HHmmss" )
).toString()
  

2012-11-07T12:16:03

java.time

现代方法使用Java 8及更高版本中内置的 java.time 类。这些类本质上是thread-safe。这些类取代了非线程安全的麻烦的旧遗留日期时间类。

字符串输入=" 2012-11-07-121603" ;     DateTimeFormatter f = DateTimeFormatter.ofPattern(" uuu-MM-dd-HHmmss");

解析为LocalDateTime,因为您的输入缺少有关时区或偏离UTC的信息。

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

ldt.toString():2012-11-07T12:16:03

线程安全性

java.time 类设计为thread-safe。这些课程使用immutable objects。您可以缓存DateTimeFormatter之类的对象,以便在整个代码和线程中重复使用。

ISO 8601

将日期时间值序列化为文本时,仅使用标准ISO 8601格式。不要发明自己的格式,例如问题中显示的格式。标准格式实用且合理。它们的设计易于通过机器进行解析,并且易于被不同文化的人阅读。

java.time 类在解析/生成字符串时默认使用ISO 8601格式。上面显示的例子。

关于 java.time

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

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

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

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