用户将以不同的模式输入日期到我的应用程序。对于两位数的年份,他还必须确定枢轴日期。
示例:
pattern = yy-MM-dd
pivot date = 70 (我以编程方式添加当前的千年和上个世纪以获得更多动态=> 1970 )
69-04-22 成为 2069-04-22
70-04-22 成为 1970-04-22
如this answer中所述,当日期模式(此处为 ddMMyy )已知时,可以轻松构建DateTimeFormatter
。
但是由于用户输入了模式,我不确定如何正确构建DateTimeFormatterBuilder
。我不能硬编码。
我是否必须自己解析模式并按正确的顺序致电appendPattern()
和appendValueReduced()
?或者是否有内置解决方案?
答案 0 :(得分:2)
这里是Java-8解决方案(它看起来像一个黑客):
String pattern = "MM/dd/yy 'US'"; // user-input
String text = "10/04/69 US"; // user-input
Locale locale = Locale.US; // user-input, too?
int yy = pattern.indexOf("yy");
DateTimeFormatter dtf;
if (
(yy != -1) // explanation: condition ensures exactly two letters y
&& ((yy + 2 >= pattern.length()) || pattern.charAt(yy + 2) != 'y')
) {
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
String part1 = pattern.substring(0, yy);
if (!part1.isEmpty()) {
builder.appendPattern(part1);
}
builder.appendValueReduced(ChronoField.YEAR, 2, 2, 1970);
String part2 = pattern.substring(yy + 2);
if (!part2.isEmpty()) {
builder.appendPattern(part2);
}
dtf = builder.toFormatter(locale);
} else {
dtf = DateTimeFormatter.ofPattern(pattern, locale);
}
LocalDate ld = LocalDate.parse(text, dtf);
System.out.println("user-date: " + ld); // 2069-10-04
只有一个小小的警告:如果任何用户有疯狂的想法分别定义两次" yy"在模式中,建议的解决方案将失败。那么正确的解决方案需要对模式字符进行某种迭代,但我认为这是过度的,所以我把它留在这里。
为了进行比较,使用我的外部库Time4J可以实现以下简短解决方案,因为它的解析引擎还具有设置任何合适格式属性的概念:
LocalDate ld =
ChronoFormatter.ofDatePattern(pattern, PatternType.CLDR, locale)
.with(Attributes.PIVOT_YEAR, 2070).parse(text).toTemporalAccessor();