3 回答
TA贡献1757条经验 获得超8个赞
格式的时区部分需要一个前导 + 或 - 字符。因此,您提供的字符串失败了。如果您尝试使用“20190911T14:37:08.777 + 0400”,它会起作用。
我没有看到任何可与没有符号的 4 位时区偏移一起使用的选项。
TA贡献1842条经验 获得超21个赞
使用正确的格式代码。
输入意味着微秒范围内的小数秒?
如果最后的数字代表秒的一小部分,则此代码有效。用七位数字来表示秒的小数部分是不寻常的;3(3、6 或 9)的增量更为常见。但我们可以让它发挥作用。
String input = "20190911T14:37:08.7770400" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMdd'T'HH:mm:ss.SSSSSSS" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString(): 2019-09-11T14:37:08.777040
输入意味着偏移?输入错误。
如果最后的数字是以毫秒为单位的小数秒和与 UTC 的偏移量(小时数和分钟数)的四位数字的组合,那么您的输入就有错误。偏移量要么早于 UTC,要么晚于 UTC。因此偏移量必须包含加号+
或减号-
。您的输入两者都没有,因此无法解析此类字符串的相对 UTC 偏移量。
ISO 8601
输入字符串的格式很糟糕,显然是对标准ISO 8601格式的笨拙修改。例如:2013-04-03T17:04:39.9437823+04:00
. 我强烈建议您对这些数据的发布者进行有关 ISO 8601 标准的教育。不要发明新格式,坚持标准。
java.time类在解析/生成字符串时默认使用ISO 8601格式。因此,根本不需要指定格式模式!
另一件事:如果您尝试跟踪时间轴上的时刻、实际点,那么您必须在输入中包含偏移量或时区。如果没有这种背景,我们不知道输入是否意味着日本东京的下午 2 点或美国俄亥俄州托莱多的下午 2 点——两个截然不同的时刻,相隔几个小时。
TA贡献1871条经验 获得超8个赞
String dateFormatter ="20190911T14:37:08.777+0400";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HH:mm:ss.SSSZZZZ");
try {
System.out.println(sdf.parse(dateFormatter));
} catch (Exception ex) {
System.out.println(ex);
}
添加 + 应该可以,并检查它是“yyyyMMdd”而不是“YYYYMMDD”。
添加回答
举报