我正在尝试将日期从一种格式转换为另一种格式
输入字符串 - 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)
答案 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)
LocalDateTime.parse(
"2012-11-07-121603" ,
DateTimeFormatter.ofPattern( "uuu-MM-dd-HHmmss" )
).toString()
2012-11-07T12:16:03
现代方法使用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格式。不要发明自己的格式,例如问题中显示的格式。标准格式实用且合理。它们的设计易于通过机器进行解析,并且易于被不同文化的人阅读。
java.time 类在解析/生成字符串时默认使用ISO 8601格式。上面显示的例子。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。