将DateTime从CSV文件转换为Java字段

时间:2019-10-11 21:14:40

标签: java opencsv

在我的csv文件中,我的列包含这样的日期:

my_col,...
2016-06-28 21:05:56 ADT
2016-06-28 22:05:56 ADT
2016-06-28 23:05:56 ADT

我必须将此CSV文件映射到Java对象。

我尝试了多种解决方案,例如:

final String str = "2016-06-28 14:18:28 ADT";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss");
LocalDateTime ld2 = LocalDateTime.parse( str , f ) ;

但是我有错误:

  

java.time.format.DateTimeParseException:文本'2016-06-28 14:18:28   无法解析ADT,在索引19处找到未解析的文本

如何将这种日期(2016-06-28 14:18:28 ADT)转换为Java字段?

哪个API向我展示了如何将CSV文件映射到Java对象列表?

1 个答案:

答案 0 :(得分:1)

要在Java中阅读csv,您可以使用例如this one

关于解析日期应以哪个属性/对象结尾的问题

  

所以我的java对象字段必须是类型:ZonedDateTime吗?”   不,您可以使用字符串,将其拆分为多个Integer,使用DateTime加上时区的字符串...,如您所愿。

关于您的模式,请查看datetimeformatter模式上的oracle documentation,您可以使用此方法:

DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss z");
System.out.println(ZonedDateTime.parse("2016-06-28 14:18:28 ADT", f));
    says "2016-06-28T14:18:28-03:00[SystemV/AST4ADT]"

respectable lists一侧显示“ SystemV / AST4ADT”,而另一侧似乎是outdated convention(来自SystemV)。

现在在注释中已经注意到,在其他系统上相同的输入字符串会产生

2016-06-28T14:18:28-03:00[America/Halifax]

我认为,这可以追溯到本地系统的设置,更准确地说,可以是jvm时区设置和计算机的本地时区(请参见下文)。

考虑到注释中的其他信息,很明显,您无法通过ZonedDateTime路由从输入字符串切实地恢复“ ADT”(从字面上看)。如果您想保留它,则类似"2016-06-28 14:18:28 ADT".substring(21)的东西可能是最经济的版本,尽管看起来很丑陋。我会接受的。

不过,还有其他选择。很有可能,所有日期值都来自同一时区,因此您一开始就不需要它。如果这样做,则可以在当前all possible time zones(425)与其缩写(zonedDateTime.getZone()-> String)之间创建映射。

现在,它变得越来越深奥了,Oracle似乎发布了一个神秘的time zone updater tool,它应该保持JVM的时区为最新状态,并从当前的时间zone database开始使用它的值。维护的版本是IANATime Zone Database,下载后包含theory.html,其中包含“ 时区缩写”部分,其中显示:“ 软件包安装后,它会生成时区缩写,例如“ EST”,以与人类传统和POSIX兼容。”。然后令我高兴的是,在Linux上有一个zdump命令,它使用{p>来响应zdump Canada/Atlantic UTC

Canada/Atlantic Sat Oct 12 03:39:19 2019 ADT

您可以提取整个列表,我将命令和输出放在github gist中。您不会得到例如“ SystemV / AST4ADT”的解码。整个SystemV命名法似乎是deprecated,所以我想知道,这是如何在ZonedDateTime中弹出的。我最终在ican's database中找到“ systemv”文件的地方,您可以在下面找到相关内容。

这里还有一个Web服务提供商,您可以在其中找到time zones plus abbreviations的完整列表,如果您喜欢这种事情,则可以使用该服务。但是,不包括“ SystemV / AST4ADT”之类的内容。

“ systemv”文件的内容,您必须使用GMT偏移量(例如-4:00)映射到时区数据库的缩写

tzdb data for System V rules (this file is obsolete)
Zone    NAME        STDOFF  RULES/SAVE  FORMAT  [UNTIL]
Zone    SystemV/AST4ADT -4:00   SystemV     A%sT
Zone    SystemV/EST5EDT -5:00   SystemV     E%sT
Zone    SystemV/CST6CDT -6:00   SystemV     C%sT
Zone    SystemV/MST7MDT -7:00   SystemV     M%sT
Zone    SystemV/PST8PDT -8:00   SystemV     P%sT
Zone    SystemV/YST9YDT -9:00   SystemV     Y%sT
Zone    SystemV/AST4    -4:00   -       AST
Zone    SystemV/EST5    -5:00   -       EST
Zone    SystemV/CST6    -6:00   -       CST
Zone    SystemV/MST7    -7:00   -       MST
Zone    SystemV/PST8    -8:00   -       PST
Zone    SystemV/YST9    -9:00   -       YST
Zone    SystemV/HST10   -10:00  -       HST