【问题标题】:Convert /Date(XXXXXX)/ into Date like YYYY-MM-DD将 /Date(XXXXXX)/ 转换为日期,如 YYYY-MM-DD
【发布时间】:2019-11-18 18:58:08
【问题描述】:

我收到一个 XML,其中一些字段具有日期值,但它们是“加密的”,我不知道如何转换。

例子:

输入:

<effectiveEndDate>/Date(253402214400000)/</effectiveEndDate>
<code>002956</code>
<lastModifiedDateTime>/Date(1574082723000+0000)/</lastModifiedDateTime>

预期输出:

<effectiveEndDate>9999-12-31T00:00:00.000GMT</effectiveEndDate>
<code>002956</code>
<lastModifiedDateTime>2019-11-12T17:18:39.000GMT</lastModifiedDateTime>

请注意,这是我想要日期字段的示例,它不是真正的转换值。

谁能照亮道路?

【问题讨论】:

  • 您需要知道输入的值才能正确地将其转换为所需的格式。如果是加密的,需要先解密。
  • 这显然是一个 SAP JSON 日期时间。见developer.jboss.org/message/985070
  • 我使用了“加密”这个词,但它并没有真正加密。就像在 excel 中一样,它们在内部具有值 43780,但它们转换为日期,例如 2019-11-11。但我不知道如何在 Java 上做到这一点。 excel例子只是一个比较,xml和excel没有关系。
  • 对于您的输出,它类似于ISO 8601,因此我建议您采取完整的步骤。这只是意味着使用Z(对于UTC 或“祖鲁时区”)而不是GMT

标签: java date datetime-format java-time milliseconds


【解决方案1】:

多亏了罗伯特·哈维,我才能够找到这个日期的确切日期... 我找到了这个SAP Blog,他解释说这个字段有

“/Date()/” = 自 1970 年 1 月 1 日午夜以来的毫秒数 块引用

所以,我找到了这个tool,在那里我可以看到它是如何工作的。

最后我的解决方案是:

System.out.println(Instant.ofEpochMilli(Long.parseLong("253402214400000")));

因为this!,我才能够找到。

非常感谢!! 我希望这能找到像我一样完全迷失的人:D

【讨论】:

    【解决方案2】:

    您可以按如下方式解析日期值:

    import java.time.Instant;
    import java.time.ZoneOffset;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    
        public class Main {
            public static void main(String[] args) {
                ZonedDateTime utc = Instant.ofEpochMilli(253402214400000L).atZone(ZoneOffset.UTC);
                System.out.println( DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSO").format(utc));
            }
        }
    

    输出:

    9999-12-31T00:00:00.000GMT
    

    【讨论】:

    • O 模式不打印偏移量吗?还是在这种情况下因为它为零而省略?
    • @erickson - 是的,O 根据问题的要求打印localized zone-offset。是的,在这种情况下它被省略了,因为它为零(其他读者注意UTC 的偏移量为+00:00 小时)。如果使用具有非零偏移量的ZoneId,则还将打印偏移量,例如对于.atZone(ZoneId.of("Asia/Calcutta")),它将打印9999-12-31T05:30:00.000GMT+5:30
    • 我没有看到问题中对偏移量的要求,并且接受的答案使用 UTC 中的 ISO“即时”格式。
    • @erickson - 要求说明:Output Expected: &lt;effectiveEndDate&gt;9999-12-31T00:00:00.000GMT&lt;/effectiveEndDate&gt; 因此恕我直言,除非我遗漏了什么,否则此解决方案符合要求。我不确定您指的是哪个答案是公认的答案 - 是 OP 自己发布的答案吗?
    • 是的,这个答案确实产生了所需的输出。我的意思是 OP 的答案。
    【解决方案3】:

    你也可以这样做

    ZonedDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(sapDate.replaceAll("\\D+",""))),
      ZoneId.systemDefault());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2013-10-19
      • 1970-01-01
      相关资源
      最近更新 更多