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

标签 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: 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 获取它的值,当前维护的版本是 IANATime 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/

相关文章:

Java,将字符串从一种方法传递到另一种方法

java - 使用 Nosql 配置 SpringBatch

java - 在流过滤器中包含 IgnoreCase 来计算字符串列表中某个特定单词的出现次数

java - 当行缺少引号时 OpenCSV 无限循环

unit-testing - Spock:从 CSV 文件读取测试数据

java - 如何从 CSV 文件中读取可读内容?

java - Java中数组的使用方法

java - 将所有字符串字段更改为大写

java - opencsv 的 CSVParser 中 parseLine 和 parseLineMulti 的区别

java - 为什么包含的库项目会更改我的 Android 应用程序的标题?