使用可选的Parser从joda-time DateTimeFormatter打印

时间:2015-04-28 13:35:37

标签: java datetime jodatime

在使用joda-time 2.1的项目中,我有以下DateTimeFormatter

   /**
   * Parser for the "fraction" part of a date-time value.
   */
  private static final DateTimeParser FRACTION_PARSER =
      new DateTimeFormatterBuilder()
          .appendLiteral('.')
          .appendFractionOfSecond(3, 9)
          .toParser();

  /**
   * A formatter for a "local" date/time without time zone offset
   * (in the format "yyyy-dd-mmThh:mm:ss[.fff]").
   */
  private static final DateTimeFormatter FORMAT_LOCAL =
      new DateTimeFormatterBuilder()
          .append(ISODateTimeFormat.date())
          .appendLiteral('T')
          .append(ISODateTimeFormat.hourMinuteSecond())
          .appendOptional(FRACTION_PARSER)
          .toFormatter()
          .withZone(DateTimeZone.UTC);

它完全符合我的要求。它使用或不使用分数来分析日期,并打印出没有分数的日期。

如果我升级到更新版本的joda-time,我会

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.UnsupportedOperationException: Printing is not supported
    at org.joda.time.format.DateTimeFormatterBuilder.toPrinter(DateTimeFormatterBuilder.java:136)

所以我猜我之前的错误是错误的,但它确实是我想要做的!如何在不发生错误的情况下获得相同的行为?我尝试使用append(DateTimePrinter, DateTimeParser[])使用空打印机和打印机实际上不打印任何东西,但它们都不起作用。

2 个答案:

答案 0 :(得分:3)

所以我最终想出来了,解决方案是分别构建完整的解析器和打印机,如下所示:

  /**
   * Parser for the "fraction" part of a date-time value.
   */
  private static final DateTimeParser FRACTION_PARSER =
      new DateTimeFormatterBuilder()
          .appendLiteral('.')
          .appendFractionOfSecond(3, 9)
          .toParser();

  private static final DateTimeParser BASE_PARSER =
      new DateTimeFormatterBuilder()
          .append(ISODateTimeFormat.date())
          .appendLiteral('T')
          .append(ISODateTimeFormat.hourMinuteSecond())
          .appendOptional(FRACTION_PARSER)
          .toParser();

  private static final DateTimePrinter BASE_PRINTER =
      new DateTimeFormatterBuilder()
          .append(ISODateTimeFormat.date())
          .appendLiteral('T')
          .append(ISODateTimeFormat.hourMinuteSecond())
          // omit fraction of second
          .toPrinter();

  /**
   * A formatter for a "local" date/time without time zone offset
   * (in the format "yyyy-dd-mmThh:mm:ss[.fff]").
   */
  private static final DateTimeFormatter FORMAT_LOCAL =
      new DateTimeFormatterBuilder()
          .append(BASE_PRINTER, BASE_PARSER)
          .toFormatter()
          .withZone(DateTimeZone.UTC);

答案 1 :(得分:0)

是否有理由需要使用打印机。这对你有用吗?它为我编译并输出正确的日期/时间。

private static final DateTimeParser FRACTION_PARSER =
        new DateTimeFormatterBuilder()
                .appendLiteral('[')
                .appendLiteral('.')
                .appendFractionOfSecond(3, 9)
                .appendLiteral(']')
                .toParser();

/**
 * A formatter for a "local" date/time without time zone offset
 * (in the format "yyyy-dd-mmThh:mm:ss[.fff]").
 */
private static final DateTimeFormatter FORMAT_LOCAL =
        new DateTimeFormatterBuilder()
                .append(ISODateTimeFormat.date())
                .appendLiteral('T')
                .append(ISODateTimeFormat.hourMinuteSecond())

                .appendOptional(FRACTION_PARSER)
                        .toFormatter()
                        .withZone(DateTimeZone.UTC);

String strInputDateTime = "1990-12-11T13:12:22[.025]";

DateTime dt = FORMAT_LOCAL.parseDateTime(strInputDateTime);

System.out.println(dt);

从阅读Javdoc开始,提到了toParser();没有被使用而是使用toFormatter();我希望这会有所帮助。

  

toParser

     

public DateTimeParser toParser()   使用所有附加元素创建DateTimeParser实例的内部方法。   大多数应用程序不会使用此方法。如果您想在应用程序中使用解析器,请调用tomatter()并使用解析API。

     

对此构建器的后续更改不会影响返回的解析器。

     

抛出:   UnsupportedOperationException - 如果不支持解析

http://www.joda.org/joda-time/apidocs/index.html

实际上这可能更有用

  

public DateTimeFormatter toFormatter()   使用所有附加元素构造DateTimeFormatter。   这是应用程序在构建过程结束时用于创建可用格式化程序的主要方法。

     

对此构建器的后续更改不会影响返回的格式化程序。

     

返回的格式化程序可能不支持打印和解析。 DateTimeFormatter.isPrinter()和DateTimeFormatter.isParser()方法将帮助您确定格式化程序的状态。

     

抛出:   UnsupportedOperationException - 如果既不支持打印也不支持解析