【问题标题】:Parse a Fri, 03 Nov 2017 09:12:46 java which shows unparsable解析一个星期五,2017 年 11 月 3 日 09:12:46 显示无法解析的 java
【发布时间】:2017-11-28 10:58:34
【问题描述】:

2017 年 11 月 3 日星期五 09:12:46 这是我的日期格式,我想在 java 中使用 SimpleDateFormat() 对其进行解析

【问题讨论】:

  • 预期输出是什么?
  • 我必须获取日期并获取纽约的时区
  • 为什么要使用SimpleDateFormatjava.time, the modern Java date and time API also known as JSR-310, 使用起来更好。坦率地说,SimpleDateFormat 早已过时并且出了名的麻烦。
  • ZonedDateTime newYorkTime = LocalDateTime.parse("Fri, 03 Nov 2017 09:12:46", DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss", Locale.US)) .atZone(ZoneId.of("America/New_York"));
  • 向我们展示给您“无法解析的日期”消息的代码,您是否会了解更多信息,以便我们希望查明您做错了什么?

标签: java date simpledateformat


【解决方案1】:

试试这个:

    DateFormat df = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH);
    Date date = df.parse("Fri, 03 Nov 2017 09:12:46");
    System.out.println(date);

【讨论】:

  • 这段代码使用了麻烦的旧日期时间类,现在已被 java.time 类取代。
【解决方案2】:

我曾经有一个任务是编写一个功能,该功能能够在不事先知道格式的情况下将日期字符串解析为日期。换句话说,一个字符串应该被识别为日期,如果它是一个有效的日期,并且不管它的格式是什么,都应该被解析为日期。所以我想出的解决方案是拥有一个包含我支持的所有日期格式的配置文件。我一一阅读并尝试使用该格式解析字符串。如果它有效,那么我会停下来,因为我得到了我的结果,如果不是,我会继续到最后。如果所有格式都失败,则字符串不是日期或格式不受支持。当然,添加(和删除)支持的格式不需要修改代码,因为它是我的配置文件。格式的顺序也很重要,因为这样我可以控制我更喜欢美国格式而不是欧洲风格,反之亦然。我写了一篇文章更详细地描述了这个想法。这是链接:Java 8 java.time package: parsing any string to date。标题说它适用于 java 8,但总体思路也适用于早期版本。

【讨论】:

  • 您以这种方式处理了多少数据?我只是好奇,如果数据很大,我会预测性能不佳。
  • 实际上,文件中的数据在启动时被读入内存,因此所有掩码的读取都在内存中完成。另外我使用的是 java 8,所以我在格式化时使用了 wild crds,从而减少了不同格式的数量。总而言之,它在每秒几千到几十万次解析下工作,并且运行良好。如果我需要进一步的性能提升,那么我可以添加并行处理线程。但我不需要它
  • 感谢您的信息。好吧,与我的库 Time4J 进行比较对您来说可能也很有趣,特别是如果模式由分隔符“|”连接时在相同语言环境的情况下。我认为这比使用可选括号更具可读性和准确性(并且在我自己的测试中性能更高)。
【解决方案3】:

tl;博士

LocalDateTime.parse( 
    "Fri, 03 Nov 2017 09:12:46" , 
    DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss", Locale.US ) 
)

java.time

现代方法使用 java.time 类来取代与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类。避免SimpleDateFormat之类的。

您的输入缺少任何与 UTC 或时区偏移的指标。所以我们解析为LocalDateTime

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss", Locale.US ) ;
LocalDateTime ldt = LocalDateTime.parse( "Fri, 03 Nov 2017 09:12:46" , f ) ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多