如何将String(" 1-DEC-16")和(" 01-DEC-16")转换为java日期为01-DEC-2016

时间:2017-06-06 07:40:37

标签: java

我将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);

1 个答案:

答案 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.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