【问题标题】:Joda: parse string as DateTime with weird timezone formatJoda:使用奇怪的时区格式将字符串解析为 DateTime
【发布时间】:2018-09-13 15:31:25
【问题描述】:

对于如下日期字符串,是否存在有效的 joda DateTimeFormat

2018 年 7 月 23 日星期一 07:08:26 +0300 GMT

我试过了:

DateTimeFormatter FMT1 = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss Z");
DateTimeFormatter FMT2 = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss z");
DateTimeFormatter FMT3 = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss z Z");

但这些都不起作用。 我在这里查看了https://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html,我想不出一种方法来解析该日期而不必先更改字符串本身。 有什么办法吗?

【问题讨论】:

  • 我在 Joda 中找不到这种模式。如果您可以使用 java.time.format.DateTimeFormatter,则该模式有一个标准模式:RFC_1123_DATE_TIME。见这里docs.oracle.com/javase/8/docs/api/java/time/format/…
  • @rick 有两个(冲突的)偏移量 +0300GMTRFC_1123_DATE_TIME 不完全匹配。
  • 那是偏移不冲突。从文档中打开格式的描述,你会看到docs.oracle.com/javase/8/docs/api/java/time/format/…
  • @rick 我尝试使用该格式化程序解析字符串,但由于未解析文本而出现异常,指向+0300GMT 之间的空格。你是对的,它很接近。也足够接近,您可以使用该格式化程序,您只需要以一种您不坚持解析整个字符串的方式进行解析(我认为这有点 hack)。

标签: java jodatime


【解决方案1】:

我认为+0300 是真正的偏移量,GMT 只是说+0300 是相对于 GMT 的。 Joda-Time 支持用撇号分隔不应解释的常量文本:

    DateTimeFormatter formatter = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss Z 'GMT'");

    DateTime dt = DateTime.parse("Mon, 23 Jul 2018 07:08:26 +0300 GMT", formatter);
    System.out.println(dt);

欧洲/哥本哈根时区我的电脑上的输出:

2018-07-23T06:08:26.000+02:00

顺便说一句,使用小写和大写 z 的想法还不错。如果您将它们按相反的顺序放置,它会起作用:

    DateTimeFormatter formatter = DateTimeFormat.forPattern("E, d MMM yyyy HH:mm:ss Z z");

2018-07-23T04:08:26.000Z

不过,我更喜欢撇号。读者很难知道Z z 会带来什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多