解析2位数年份:使用未知日期模式设置数据透视日期

用户将以不同的模式向我的应用程序输入日期。 对于两位数的年份,他还必须确定枢轴日期。


例:
pattern = yy-MM-dd
pivot date = 70 (我以编程方式添加当前千年和上个世纪以获得更多动态=> 1970

69-04-22成为2069-04-22
70-04-22成为1970-04-22


与此答案中描述的一样,当日期模式(此处为ddMMyy )已知时,可以轻松构建DateTimeFormatter
但是由于用户输入了模式,我不确定如何正确构建DateTimeFormatterBuilder 。 我不能硬编码。

我是否必须自己解析模式appendValueReduced()正确的顺序调用appendPattern()appendValueReduced() ? 还是有内置的解决方案?

这里是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();