当前位置: 首页 > 知识库问答 >
问题:

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

邹慈
2023-03-14

正如本答案中所述,当日期模式(这里是ddMMyy)已知时,构建DateTimeFormatter很容易。
但是由于用户输入模式,我不知道如何正确构建DateTimeFormatterBuilder。我不能硬编码。

我必须自己解析模式并按正确的顺序调用appendpattern()appendvaluereduced()吗?还是有一个内置的解决方案?

共有1个答案

邰昀
2023-03-14

这里是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();
 类似资料:
  • 问题内容: 用户将以不同的模式向我的应用程序输入日期。对于两位数的年份,他还必须确定关键日期。 示例: pattern = yy-MM-dd 枢轴日期= 70 (我以编程方式添加了当前的千年和上个世纪,以获得更多动态=> 1970 ) 69-04-22 变为 2069-04-22 70-04-22 变为 1970-04-22 像此答案中所述,很容易在已知日期模式(此处为 ddMMyy )时构建一个

  • 我正在处理卡的到期日期。我有一个API,我将在其中获得“yyMM”格式的到期日期为“String”。在这里,我正在尝试使用 带有TimeZone.getTimeZone("UTC ")的SimpleDateFormat 所以我的代码就像 现在的问题是,当我通过 2011 年时,它给出的是 这里你可以看到我把11作为月份,但是它把它转换成10月而不是11月。 为什么? 还有哪些其他选项可以将带有 的

  • Excel单元格的日期格式为,显示日期为4位年份。然而,POI以另一种格式返回日期。单元格样式返回相同的格式,带有2位year。 有没有可能用POI获得与我在Excel中看到的格式相同的格式?

  • 问题内容: 我正在尝试将包含2007年12月1日等各个部分的日期转换为SQL Server 2005中的日期时间。我尝试了以下方法: 但这会导致日期错误。将三个日期值转换为正确的日期时间格式的正确方法是什么? 问题答案: 假设全部,如何:

  • 问题内容: 我从网络上获取了日期字符串,然后我想将其切成对象。但是应用程序以某种方式崩溃。这是我正在解析的字符串: onStartCommand() stringToDate() LogCat: 编辑: onDestroy()为定期更新设置警报… 问题答案: 从中删除“ XXX” 一切都会正常。 浏览可在构造函数内使用的符号列表。尽管文档显示的是“ XXX”格式,但这在Android上不起作用,并

  • 问题内容: 根据doc,日历set()为: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html#set%28int,%20int,%20int%29 码: 输出: 为什么不是1月30日??? 问题答案: 1月是2月。2月30日更改为3月1日。您应该将月份设置为0。最好是使用Calendar中定义的常量: