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

解析两位数年份:使用未知的日期格式设置枢轴日期

贺宝
2023-03-14
问题内容

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

示例:
pattern = yy-MM-dd
枢轴日期= 70 (我以编程方式添加了当前的千年和上个世纪,以获得更多动态=> 1970

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

像此答案中所述,很容易在已知DateTimeFormatter日期模式(此处为
ddMMyy )时构建一个。
但是由于用户输入了模式,所以我不确定如何DateTimeFormatterBuilder正确构建。我不能硬编码。

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


问题答案:

这里是Java-8解决方案(它看起来像个hack):

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”,则建议的解决方案将失败。正确的解决方案然后需要对模式char进行某种迭代,但是我认为这过于矫kill过正,因此我将其保留在此处。

只是为了进行比较,使用我的外部库Time4J可以实现以下简短解决方案,因为其解析引擎还具有设置任何适当格式属性的概念:

LocalDate ld = 
  ChronoFormatter.ofDatePattern(pattern, PatternType.CLDR, locale)
  .with(Attributes.PIVOT_YEAR, 2070).parse(text).toTemporalAccessor();


 类似资料:
  • 正如本答案中所述,当日期模式(这里是ddMMyy)已知时,构建很容易。 但是由于用户输入模式,我不知道如何正确构建。我不能硬编码。 我必须自己解析模式并按正确的顺序调用和吗?还是有一个内置的解决方案?

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

  • 我想以yyyy-mm-dd格式存储今天的日期。在存储之前,我将今天的日期格式化,并再次解析格式化后的字符串。它以不同于我想要的格式给出了输出日期。我如何获得日期,将其格式化为' yyyy-mm-dd '并再次将其转换为日期,并希望输出格式为' yyyy-mm-dd '。请找到下面的代码,告诉我哪里错了 我得到的上述代码的输出是星期四 Mar 07 00:00:00 GMT 2013.但我希望输出为

  • 我想用Apache POI在Excel文件中设置日期格式。该值将以这样的方式设置,以便在地址栏中显示为MM/DD/YYYY,在单元格中显示为dd-mmm(数字日和月缩写:01-JAN)。

  • 问题内容: 我需要一个mysql查询来从数据库表中的以下日期格式中提取年份。 例如: 以下查询不起作用 列类型为varchar。有什么办法解决这个问题? 问题答案: 由于您的subdateshow是VARCHAR列,而不是正确的DATE,TIMESTAMP或DATETIME列,因此必须在使用YEAR之前将字符串转换为日期: 参见http://dev.mysql.com/doc/refman/5.5