在我的 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: Text '2016-06-28 14:18:28 ADT' could not be parsed, unparsed text found at index 19
如何将这种日期 (2016-06-28 14:18:28 ADT
) 转换为我的 Java 字段?
哪个 API 向我展示了如何将 CSV 文件映射到 Java 对象列表?
最佳答案
要在 java 中读取 csv,您可以使用库,例如this one。
关于解析日期应该在哪个属性/对象中结束的问题
"so my java object field must be of type : ZonedDateTime ?" No, you could use a string, split it in several Integers, use DateTime plus a String for the time zone ... as you like it.
至于你的模式,查看 oracle documentation on datetimeformatter 模式,你可以使用这个:
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]"
一侧的“SystemV/AST4ADT”出现在 respectable lists 中,但另一侧似乎是 outdated convention(来自 SystemV)。
现在在评论中已经注意到在其他系统上相同的输入字符串产生
2016-06-28T14:18:28-03:00[America/Halifax]
我认为,这可以追溯到本地系统的设置,更准确地说,jvm 时区设置和机器的本地时区(见下文)。
考虑到评论中的附加信息,您可以清楚地看到,您无法从输入字符串中可靠地恢复“ADT”(字面意思),而是通过 ZonedDateTime 进行路由。如果你想保留它,像 "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
,其中有一个“Time zone abbreviations”部分,上面写着:“安装此包时,它会生成时区缩写,例如 ' EST' 与人类传统和 POSIX 兼容”。然后我高兴地发现在 Linux 上有 zdump 命令响应 zdump Canada/Atlantic UTC
with
加拿大/大西洋星期六 2019 年 10 月 12 日 03:39:19 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
关于java - 将 DateTime 从 CSV 文件转换为 Java 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348532/