为了账号安全,请及时绑定邮箱和手机立即绑定

如何将“以下字符串”20190911T14:37:08.7770400”解析为日期格式

如何将“以下字符串”20190911T14:37:08.7770400”解析为日期格式

人到中年有点甜 2023-07-28 10:01:36
我正在尝试将字符串解析为简单的日期格式,但无法解析日期异常。有人可以尝试帮助我解决这个问题吗?  String dateFormatter ="20190911T14:37:08.7770400";  SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDD'T'HH:mm:ss.SSSZZZZ");  //tried the below commnet also  //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-d'T'HH:mm:ss.SSSZZZZ");  System.out.println(sdf.parse(dateFormatter)); Error:        "Exception in thread "main" java.text.ParseException: Unparseable        date: "20190911T14:37:08.7770400" at        java.text.DateFormat.parse(DateFormat.java:366) at       com.sudha.test.sample_boot_example.TestString.main(TestString.java:20)
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

格式的时区部分需要一个前导 + 或 - 字符。因此,您提供的字符串失败了。如果您尝试使用“20190911T14:37:08.777 + 0400”,它会起作用。

我没有看到任何可与没有符号的 4 位时区偏移一起使用的选项。 

查看完整回答
反对 回复 2023-07-28
?
茅侃侃

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 点——两个截然不同的时刻,相隔几个小时。


查看完整回答
反对 回复 2023-07-28
?
ITMISS

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”。


查看完整回答
反对 回复 2023-07-28
  • 3 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信