我有一个CSV文件,我试图使用java导入。包含不同格式的日期列和日期的文件我想解析适合myqsl的日期。
我的代码为:
CSVFormat format = CSVFormat.RFC4180.withHeader().withDelimiter(',');
CSVParser parsernew =CSVParser(File, format)
List<CSVRecord> csvRecordList = parser.getRecords();
String cellvalue=csvRecordList.get(0);
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat .parse(cellvalue);
我尝试解析日期列值但得到了异常
java.text.ParseException: Unparseable date:
日期列值如
10/31/2014
12/13/2013
2001-02-04
7/27/2001
2001-02-04
5/15/2008
有没有办法解析不同的日期格式和日期格式更改运行时间如何处理..
in excel
谢谢!
答案 0 :(得分:0)
首先,在将日期时间值序列化为文本时,应该仅使用标准的ISO 8601格式来教育该数据的发布者。对于没有日期和时区的仅日期,则为YYYY-MM-DD。
幸运的是,您的示例数据仅显示两种格式:标准YYYY-MM-DD格式和M / D / YYYY。
因此,请尝试使用一对格式化程序进行解析,每种情况下一个。如果两者均失败,请抛出异常,以提醒您不幸地使用了出版商的更多格式。
仅使用 java.time 类。切勿使用可怕的旧日期时间类,例如Date
和DateFormat
。这些遗留类在几年前被Java 8及更高版本中的JSR 310所取代。
DateTimeFormatter
定义一对格式化程序。标准的一个已经定义为常量DateTimeFormatter.ISO_LOCAL_DATE
。定义另一个。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "M/d/uuuu" ) ;
使用Apache Commons CSV库在代码中获取输入字符串。但是您的代码在Question中看起来是错误的。您需要为列表中的每个CSVRecord
对象添加一个循环。然后从该对象表示的每一行中提取每一列。
CSVRecord record = = csvRecordList.get( i ) ; // Fetch nth object from list.
String cellvalue = csvRecordList.get( 0 ) ; // Extract each column/cell from each row/object. Must use annoying zero-based index counting.
DateTimeParseException
尝试使用LocalDate.parse
使用两个格式化程序中的每一个解析输入。赶上DateTimeParseException
。
LocalDate ld = null;
if( Objects.isNull( ld ) ) {
try {
ld = LocalDate.parse( cellvalue , DateTimeFormatter.ISO_LOCAL_DATE ) ;
} catch ( DateTimeParseException e ) {
// Swallow this particular exception in this particular case.
}
}
if( Objects.isNull( ld ) ) {
try {
ld = LocalDate.parse( cellvalue , f ) ;
} catch ( DateTimeParseException e ) {
// Swallow this particular exception in this particular case.
}
}
if( Objects.isNull( ld ) ) {
// Yikes! Failing all parsing attempts above means we encountered an unexpected format.
// FIXME: Handle this error scenario.
}
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。
答案 1 :(得分:0)
您可以使用 SimpleFlatMapper 来定义不同的日期格式。
举个例子:
CsvParser.mapWith(CsvMapperFactory.newInstance() .addColumnProperty(k -> k.getName().toLowerCase().contains("date"), new DateFormatProperty("dd/MM/yyyy")) .addColumnProperty(k -> k.getName().toLowerCase().contains("date"), new DateFormatProperty("dd-MM-yyyy")) .newMapper(Trade.class)) .stream(reader).collect(toList());