在我的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对象列表?
答案 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开始使用它的值。维护的版本是IANA的Time 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