当前位置: 首页 > 面试题库 >

DateTimeFormatter接受多个日期并转换为一个日期(java.time库)

胡星汉
2023-03-14
问题内容

我正在尝试写一个DateTimeFormatter允许我采用多种不同String格式的格式,然后将String格式转换为特定类型。由于项目的范围和已经存在的代码,我不能使用其他类型的格式化程序。

例如,我也想接受MM/dd/yyyyyyyy-MM- dd'T'HH:mm:ss但是当我打印时,我只想打印MM/dd/yyyy格式化并在我打电话时使用该格式LocalDate.format(formatter);

有人可以就如何使用 java.time.format.*;

这是我的方法org.joda

// MM/dd/yyyy format
DateTimeFormatter monthDayYear = DateTimeFormat.forPattern("MM/dd/yyyy");
// array of parsers, with all possible input patterns
DateTimeParser[] parsers = {
        // parser for MM/dd/yyyy format
        monthDayYear.getParser(),
        // parser for yyyy-MM-dd'T'HH:mm:ss format
        DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser()
};
DateTimeFormatter parser = new DateTimeFormatterBuilder()
    // use the monthDayYear formatter for output (monthDayYear.getPrinter())
    // and parsers array for input (parsers)
    .append(monthDayYear.getPrinter(), parsers)
    // create formatter (using UTC to avoid DST problems)
    .toFormatter()
    .withZone(DateTimeZone.UTC);

我没有在网上找到一个很好的/可行的例子。


问题答案:

我已经测试了这个 JDK 1.8.0_131为Mac OS XJDK 1.8.0111的Windows (包括工作)。

我创建了一个DateTimeFormatter带有可选部分(以分隔[])的,以解析两种情况(MM/dd/yyyyyyyy-MM- dd'T'HH:mm:ss)。

相同的格式化程序适用于您的情况(LocalDate),但以下是一些注意事项。

// parse both formats (use optional section, delimited by [])
DateTimeFormatter parser = DateTimeFormatter.ofPattern("[MM/dd/yyyy][yyyy-MM-dd'T'HH:mm:ss]");

// parse MM/dd/yyyy
LocalDate d1 = LocalDate.parse("10/16/2016", parser);
// parse yyyy-MM-dd'T'HH:mm:ss
LocalDate d2 = LocalDate.parse("2016-10-16T10:20:30", parser);

// parser.format(d1) is the same as d1.format(parser)
System.out.println(parser.format(d1));
System.out.println(parser.format(d2));

输出为:

2016年10月16日
2016年10月16日

PS: 仅适用于LocalDate。如果我尝试使用时间字段(例如LocalDateTime)来格式化对象,则会使用两种格式:

System.out.println(parser.format(LocalDateTime.now()));

打印:

06/18 / 20172017-06-18T07:40:55

请注意,它使用两种模式进行格式化。我的猜测是,格式化程序会检查对象是否在每个可选节中都有字段。由于LocalDate没有时间字段(小时/分钟/秒),因此第二种模式失败,并且仅打印第一种(MM/dd/yyyy)。但是LocalDateTime具有所有时间字段,并且两种模式均有效,因此都用于格式化。

我的结论是:这不是一个通用的解决方案(如Joda-
Time的版本),它更像是一个“幸运的”案例,其中涉及的模式创造了理想的情况。但是我不会在所有情况下都依赖它。

无论如何,如果您仅使用LocalDate,则可以尝试使用此代码。但是,如果您正在使用其他类型,则可能必须为输出使用 另一个
格式化程序,如下所示:

// parser/formatter for month/day/year
DateTimeFormatter mdy = DateTimeFormatter.ofPattern("MM/dd/yyyy");
// parser for both patterns
DateTimeFormatter parser = new DateTimeFormatterBuilder()
    // optional MM/dd/yyyy
    .appendOptional(mdy)
    // optional yyyy-MM-dd'T'HH:mm:ss (use built-in formatter)
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
    // create formatter
    .toFormatter();

// parse MM/dd/yyyy
LocalDate d1 = LocalDate.parse("10/16/2016", parser);
// parse yyyy-MM-dd'T'HH:mm:ss
LocalDate d2 = LocalDate.parse("2016-10-16T10:20:30", parser);

// use mdy to format
System.out.println(mdy.format(d1));
System.out.println(mdy.format(d2));

// format object with time fields: using mdy formatter to avoid multiple pattern problem
System.out.println(mdy.format(LocalDateTime.now()));

输出为:

10/16/2016
10/16/2016
06/18/2017



 类似资料:
  • 周日->明谷-0 周一->赛宁-1 周二->Selasa-2 帮我谢谢

  • 问题内容: 我的json 响应 包含一个 CreatedOn 日期: 我需要将 CreatedOn 转换为简单的日期格式,并 计算从CreatedOn日期到当前日期的差异天数。 当我调试下面的代码字符串 CreatedOn时 显示一个空值。怎么会? 问题答案: 要么 考虑使用JSON方法而不是包含。JSON具有“ has()”,用于验证密钥是否存在。 您还应该确保首先尝试{}捕获{}字符串,以确保

  • 为了实现这一点,我使用碳通过模型突变体转换日期。这意味着,首先我有日期: 我的变种人有以下几种: 现在,除了一个领域:“policy_cancellation”,一切都很好 当从表单向数据库插入数据时,如果policy_cancellation为空,则提交成功,但如果有数据,则PDO返回错误,例如: 触发以下命令: 另一个奇怪的情况(至少对我来说)是,在policy_cancellation突变体

  • 我正在尝试转换以下内容: 在细枝上,但它却抛出了错误 未捕获的异常: DateTime::__construct():未能解析时间字符串(26/03/2013)在位置0(2): /home/vagrant/Code/Phantom网站/供应商/twig/twig/lib/Twig/T中的意外字符emplate.php行218。 如果我通过这个: 它的工作原理,所以我想我需要改变一些与树枝日期格式相

  • 问题内容: 我正在使用需要json日期格式的API。 我需要转换我的JavaScript日期 1970年1月17日星期六格林尼治标准时间+0100(浪漫标准时间) 以json日期格式 /日期(1405699200)/ 问题答案: 列各项可以吗?

  • 问题内容: 我有一个输出数据数组的PHP脚本。然后将其转换为使用函数。 我的问题是我的数组中有一个日期,但日期格式不正确。 我怎样才能在PHP中转换它呢? 代替上面的日期,我需要等效的JavaScript函数 新的Date() 当我输出上述内容时,我得到以下内容:“ Fri Jun 01 2012 11:08:48 GMT + 0100(GMT Daylight Time)”但是,如果我将PHP日