将日期时间从CSV文件转换为Java字段

将日期时间从CSV文件转换为Java字段,java,opencsv,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-d

在我的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对象列表?

要在Java中读取CSV,可以使用如下库:

至于解析日期应该在哪个属性/对象中结束的问题

“那么我的java对象字段的类型必须是:ZonedDateTime?” 不,您可以使用字符串,将其拆分为几个整数,使用DateTime加上时区字符串。。。随你的便

至于您的模式,请查看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”显示在中,但另一侧似乎是(来自SystemV)

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

2016-06-28T14:18:28-03:00[America/Halifax]
我认为,这可以追溯到本地系统的设置,更准确地说,jvm时区设置和机器的本地时区(见下文)

考虑到评论中的附加信息,很明显,您无法真正地从输入字符串中恢复“ADT”(字面意思),而是在ZonedDateTime上执行该路径。如果您想保留它,可以使用类似于“2016-06-28 14:18:28 ADT”的内容。子字符串(21)可能是最经济的版本,尽管它很难看。我要了

不过,还有其他选择。很有可能,你所有的日期值都来自同一个时区,你根本不需要它。如果您这样做了,您可以创建一个映射,在425到它们的缩写(ZoneDateTime.getZone()->String)之间

现在它变得越来越深奥了,Oracle似乎有一个神秘的版本,它应该使JVM的时区保持最新,并从一个时间获取它的值,当前维护的版本是,下载时它包含一个
theory.html
,其中有一节“时区缩写”,它说:“当安装此软件包时,它会生成类似“EST”的时区缩写,以与人类传统和POSIX兼容”。然后我高兴地发现,在linux上有一个zdump命令,它响应
zdump Canada/Atlantic UTC

加拿大/大西洋周六10月12日03:39:19 2019 ADT

您可以提取整个列表,我将命令和输出放在一个文件中。您没有得到的是对例如“SystemV/AST4ADT”的解码。整个SystemV术语似乎是,所以我想知道,这是如何在ZoneDateTime中弹出的。我最终在中找到了“SystemV”文件,您可以在下面找到相关内容

还有一个web服务提供商,在那里你可以找到一个完整的列表,如果你喜欢这种类型的东西,你可能会使用该服务。但不包括“SystemV/AST4ADT”之类的内容

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

System V规则的tzdb数据(此文件已过时) 区域名称STDOFF规则/保存格式[直到] 区域系统V/AST4ADT-4:00系统A%sT 区域SystemV/EST5EDT-5:00 SystemV E%sT 区域系统V/CST6CDT-6:00系统C%sT 区域系统V/MST7MDT-7:00系统M%sT 区域系统V/PST8PDT-8:00系统V P%sT 区域系统V/YST9YDT-9:00系统Y%sT 区域系统V/AST4-4:00-AST 区域系统V/EST5-5:00-EST 区域系统V/CST6-6:00-CST 区域系统V/MST7-7:00-MST 分区系统V/PST8-8:00-PST 区域系统V/YST9-9:00-YST 区域系统V/HST10-10:00-HST

您的数据需要与您的模式相匹配,并且您有一个“ADT”“在那里,你没有说明原因。我不知道我约会时的ADT是什么。我必须阅读csv文件,因为它是一个文件,这些日期必须存储在我的java对象中,我不知道在经过几次测试后该怎么做,这是将格式从“z |时区名称|区域名称|太平洋标准时间;PST”更改为
yyyy-MM-dd HH:MM:ss-zzz
我建议您教育CSV数据的发布者使用(零偏移量)和来交流瞬间的实践。在Java中,请参阅类。谢谢,我尝试了以下方法:final String str=“2016-06-29 00:38:03 ADT”;DateTimeFormatter f=模式的DateTimeFormatter.(“yyyy-MM-dd HH:MM:ss”);LocalDate ld=LocalDate.parse(str,DateTimeFormatter.ISO_LOCAL_DATE);localdateld=LocalDate.parse(str,f);我获取者:2016-06-28T14:18:28但如果我想将java字段重新写入csv文件,我如何再次获取:“2016-06-28 14:18:28 ADT”?为什么不使用上述模式?这是为你的案子做的测试。注意末尾的“z”。“yyyy-MM-dd HH:MM:ss z”如果你问,如何用LocalDate保存“ADT”,你不能。来自:“ISO-8601日历系统中没有时区的日期,如2007-12-03。”是的,我尝试了以下代码:
final String str=“2016-06-28 14:18:28 ADT”;DateTimeFormatter f=模式的DateTimeFormatter.(“yyyy-MM-dd HH:MM:ss z”);LocalDateTime ld2=LocalDateTime.parse(str,f);系统输出打印项次(ld2)我得到这个:2016-06-28T14:18:28。但我应该从java文件重新写入csv文件,因此从:“2016-06-28T14:18:28”我应该再次获得“2016-06-28 14:18:28 ADT”以重新写入csv文件中的内容。我该如何才能做到这一点呢?谢谢,我尝试了这个:final String str=“2016-06-29 00:38:03 ADT”;DateTimeFormatter f=模式的DateTimeFormatter.(“yyyy-MM-dd HH:MM:ss”);LocalDate ld=LocalDate.parse(str,DateTimeF
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