我将CSV数据导入数据库,其中我在该CSV中有日期列,因为某些日期类似于1-DEC-16
而没有前导零(填充零)。如何将该字符串设为01-DEC-2016
?可以使用SimpleDateFormat完成,还是有任何String格式方法?我在下面试过但是没有发生。
String d="1-DEC-17";
String newstring = new SimpleDateFormat("yyyy-MM-dd").format(d);
System.out.println(newstring);
答案 0 :(得分:0)
d
vs dd
要解析月或月中前导零的字符串,请使用一对格式设置模式字符。那个月的日期为dd
。
要解析不带前导零的字符串,请使用单个字符d
表示日期。
不幸的是,您的输入的月份名称缩写全部为大写。这违反了我所知道的英语语言环境的规范,例如Locale.US
。因此,默认情况下,DateTimeFormatter
将拒绝处理不正确的输入。为了容忍全大写,我们可以将格式化程序设置为“宽松”。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "d-MMM-uu" , Locale.US ).withResolverStyle( ResolverStyle.LENIENT ) ;
LocalDate ld = LocalDate.parse( "1-DEC-17" , f ) ;
请参阅此code run live at IdeOne.com。
ld.toString():2017-12-01
如果将此值发送到数据库,请不要将字符串用于日期时间值。使用日期时间对象作为日期时间值。
对于符合JDBC 4.2及更高版本的JDBC驱动程序,直接通过setObject
&传递java.time类型。 getObject
。
myPreparedStatement.setObject( … , ld ) ;
如果不符合要求,请简要转换为麻烦的旧版旧版java.sql.Date
。使用添加到旧类的新方法。
java.sql.Date d = java.sql.Date.valueOf( ld ) ;
myPreparedStatement.setDate( … , d ) ;
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。