我正在尝试写一个DateTimeFormatter
允许我采用多种不同String
格式的格式,然后将String
格式转换为特定类型。由于项目的范围和已经存在的代码,我不能使用其他类型的格式化程序。
例如,我也想接受MM/dd/yyyy
,yyyy-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 X 和 JDK 1.8.0111的Windows (包括工作)。
我创建了一个DateTimeFormatter
带有可选部分(以分隔[]
)的,以解析两种情况(MM/dd/yyyy
和yyyy-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日