使用可选解析器从joda time datetimeformatter打印

ddarikpa  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(450)

在一个使用jodatime2.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[]) 一台空打印机和一台实际上不打印任何东西的打印机,两者都不起作用。

axzmvihb

axzmvihb1#

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

/**
   * 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);
0s7z1bwu

0s7z1bwu2#

你需要用打印机有什么原因吗。这对你有用吗?它为我编译并输出正确的日期/时间。

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();我希望这有帮助。
托帕瑟
public datetimeparser toparser()内部方法,用于使用所有附加元素创建datetimeparser示例。大多数应用程序不会使用此方法。如果希望在应用程序中使用解析器,请调用toformatter()并使用解析api。
对该生成器的后续更改不会影响返回的解析器。
抛出:unsupportedoperationexception-如果不支持解析
http://www.joda.org/joda-time/apidocs/index.html
实际上这可能更有用
public datetimeformatter toformatter()使用所有附加元素构造datetimeformatter。这是应用程序在构建过程结束时用来创建可用格式化程序的主要方法。
此生成器的后续更改不会影响返回的格式化程序。
返回的格式化程序可能不支持打印和解析。方法datetimeformatter.isprinter()和datetimeformatter.isparser()将帮助您确定格式化程序的状态。
抛出:unsupportedoperationexception-如果既不支持打印也不支持解析

相关问题