【问题标题】:parse armydate long number to LocalDate将军队日期长数解析为 LocalDate
【发布时间】:2015-12-27 17:38:04
【问题描述】:

我有一个长号码,格式为:
Long l = 20151228;

我想把它解析成 LocalDate 对象。

我该怎么做?

【问题讨论】:

  • 使用哪个:Java 8 LocalDate 还是 Joda 的 LocalDate?你试过什么吗?

标签: java java-8 jodatime java-time


【解决方案1】:

使用java.time,您可以将数字分解为各个部分,并使用静态方法LocalDate.of 从中构建本地日期。

long militaryDate = 20151228L;
LocalDate ld = LocalDate.of((int) (militaryDate / 10000),
                            Month.of((int) (militaryDate / 100) % 100),
                            (int) (militaryDate % 100));

System.out.println(ld);

结果:

2015-12-28

【讨论】:

  • 这个答案类似于stackoverflow.com/a/11023759/44523 中提供的答案,在我看来至少是最明智的答案,因为它的效率差不多。对此的唯一改进是,如果 militaryDate 的类型更改为 int,您将摆脱强制转换。
【解决方案2】:

这样做的一种方法是将long 转换为String 并使用SimpleDateFormat 解析它:

long l = 20151228L;
DateFormat df = new SimpleDateFormat("yyyyMMdd");
Date d = df.parse(String.valueOf(l));

【讨论】:

  • 但这既不是 java.time 也不是 Joda-time 并且结果不是 LocalDate 对象。
【解决方案3】:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse( df.format(df.parse(String.valueOf(l)) );

【讨论】:

    【解决方案4】:

    我建议使用LocalDate::parse(String, DateTimeFormatter),如下所示:

    Long l = 20151228L;
    LocalDate date = LocalDate.parse(Long.toString(l), DateTimeFormatter.ofPattern("yyyyMMdd"));
    System.out.println(date);
    

    结果:

    2015-12-28

    【讨论】:

      【解决方案5】:

      我更喜欢 RealSkeptic 的答案,因为它是最有效的答案,但如果您对模运算不满意,我可以为您提供一个替代方案。

      您用于日期的整数格式实际上是 BASIC_ISO_DATE 格式。因此,您可以为此使用现有的 java.time 格式化程序:

      int dateAsInt = 20151228;  // btw no need to use long as it fits easily in an int
      LocalDate date = LocalDate.parse(Integer.toString(dateAsInt), DateTimeFormatter.BASIC_ISO_DATE);
      System.out.println(date);
      

      【讨论】:

        猜你喜欢
        • 2019-07-02
        • 1970-01-01
        • 2019-07-24
        • 2019-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多