我从Json获取对象列表,每个对象都包含日期字符串。有两种不同的格式,一种是标准的“ yyyy-MM-dd”格式,第二种是年份“ yyyy”。将这些字符串解析为unix时间戳的优雅方法是什么?目前,我正在使用带有SimpleDateFormat的双重try-catch块,但我想找到更好的解决方案。
答案 0 :(得分:1)
如果长度为四个字符,则解析为Year
。
Year y = Year.parse( input ) ;
您想如何将其表示为片刻?也许是UTC一年中第一天的第一刻?
LocalDate ld = y.atDay( 1 ) ;
Instant instant = ld.atStartOfDay( ZoneOffset.UTC ).toInstant() ;
“ Unix时间戳”是指自1970年1月1日以来UTC的毫秒数?
long millis = instant.toEpochMilli() ;
如果输入的字符长度为10个字符,则解析为LocalDate
。
LocalDate ld = LocalDate.parse( input ) ;
与上述相同。
long millis = ld.atStartOfDay( ZoneOffset.UTC ).toInstant().toEpochMilli() ;
将它们放在一起。
switch ( input.length() ) {
case 4 : return Year.parse( input ).atDay( 1 ).atStartOfDay( ZoneOffset.UTC ).toInstant().toEpochMilli() ;
case 10 : return LocalDate.parse( input ).atStartOfDay( ZoneOffset.UTC ).toInstant().toEpochMilli() ;
default : … throw exception, unexpected input.
}
答案 1 :(得分:0)
此答案是我对另一个问题的答案的副本。您的问题可能与该问题重复:How to convert String to Date without knowing the format?
我曾经有一个任务要编写一个代码,该代码可以将String解析为迄今尚未事先知道日期格式的日期。即我必须解析任何有效的日期格式。我写了一个项目,然后写了一篇文章,描述了实现背后的想法。这是文章的链接:Java 8 java.time package: parsing any string to date。 General Idea是将希望支持的所有模式写入外部属性文件,然后从那里读取它们,并尝试按一种格式逐一解析String,直到成功或用尽格式为止。请注意,顺序也很重要,因为某些字符串可能对几种格式有效(美国/欧洲差异)。优点是您可以在不更改代码的情况下继续向文件中添加/删除格式。这样的项目也可以针对不同的客户进行定制