【问题标题】:How to specify which century a date should be parsed in Joda-Time如何指定应在 Joda-Time 中解析日期的世纪
【发布时间】:2014-08-11 15:22:56
【问题描述】:

我有一些 HR 记录的日期格式为 dd/MM/yy,我正在使用 Joda-Time 将它们标准化为 dd-MM-yyyy。 所以例如下面的记录被归一化如​​下

  Input        Output
30/01/14 --> 30-01-2014
15/07/99 --> 15-07-1999
24/03/84 --> 24-03-1984

根据各种标准(人的平均寿命,公司成立时间,...),我可以假设 99 可能指的是哪一年。

但是,如果我想指定 99 指的是 1899 或以 99 结尾的其他年份,我该怎么做?

我正在阅读DateTimeFormatter 模式的文档,以及here 的解释,看起来CenturyOfEra 字段C 可能是我想要使用的,但这并不明显我将如何使用它。

【问题讨论】:

    标签: java date datetime jodatime datetime-format


    【解决方案1】:

    如果我正确理解这个问题,它被称为“枢轴年”:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormatter.html#withPivotYear%28int%29

    CenturyOfEra 就是我们当前的世纪 - XXI,这是几十年前许多科幻作家梦寐以求的世纪。

    【讨论】:

      【解决方案2】:

      java.time

      默认情况下,2000 用作年份的基值。您可以通过在以下method 中指定年份的基值来更改此行为:

      DateTimeFormatterBuilder appendValueReduced(TemporalField field,
                                                         int width,
                                                         int maxWidth,
                                                         int baseValue)
      

      演示:

      import java.time.LocalDate;
      import java.time.format.DateTimeFormatter;
      import java.time.format.DateTimeFormatterBuilder;
      import java.time.temporal.ChronoField;
      import java.util.Locale;
      
      public class Main {
          public static void main(String[] args) {
              // Test
              System.out.println(LocalDate.parse("01/30/14", dateTimeFormatterWithBaseYear("M/d/", 1900, null)));
              System.out.println(LocalDate.parse("30/01/14", dateTimeFormatterWithBaseYear("d/M/", 1800, Locale.ENGLISH)));
              System.out.println(LocalDate.parse("1/30/14", dateTimeFormatterWithBaseYear("M/d/", 1800, null)));
              System.out.println(LocalDate.parse("30/1/14", dateTimeFormatterWithBaseYear("d/M/", 1700, Locale.ENGLISH)));
              System.out.println(LocalDate.parse("01/30/1914", dateTimeFormatterWithBaseYear("M/d/", 1900, null)));
              System.out.println(LocalDate.parse("30/01/2014", dateTimeFormatterWithBaseYear("d/M/", 1800, Locale.ENGLISH)));
          }
      
          public static DateTimeFormatter dateTimeFormatterWithBaseYear(String dayMonPattern, int baseYear, Locale locale) {
              return new DateTimeFormatterBuilder()
                      .appendPattern(dayMonPattern)
                      .appendValueReduced(ChronoField.YEAR, 2, 4, baseYear)
                      .toFormatter(locale == null ? Locale.getDefault() : locale);
          }
      }
      

      输出:

      1914-01-30
      1814-01-30
      1814-01-30
      1714-01-30
      1914-01-30
      2014-01-30
      

      Trail: Date Time 了解有关 modern date-time API* 的更多信息。


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 2014-08-20
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多