如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期?

2024-02-24

如果我使用类似的模式d/M/yy用于创建 Java 8 DateTimeFormatter (例如使用DateTimeFormatter.ofPattern(pattern);(我只会用于解析,而不是格式化),它将所有两个字母的年份解释为 20xx,例如解析一个字符串就像13/5/99被解释为2099-05-13,就我而言,这是错误的(本来应该是 1999 年)。

在我的应用程序中,我试图解析 OCR 文档中的日期,例如仍然来自 90 年代,因此将日期解释为当前日期之前 80 年和之后 20 年内的旧 SimpleDateFormat 行为非常适合我。但出于各种原因,我仍然希望将整个日期解析逻辑切换到新的 Java 8 DateTimeFormatters。

查看Java源代码,我发现这都是相对于常量解释的ReducedPrinterParser.BASE_DATE,但我认为无法更改从模式构建我自己的格式化程序时使用的值。这是根本不可能的还是我错过了指定解析两个字母年份的行为的一些可能性?


您可以创建自定义格式化程序,例如d/M/yy图案:

new DateTimeFormatterBuilder()
        .appendPattern("d/M/")
        .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80))

用法示例:

public static void main(String[] args) throws Exception {
  DateTimeFormatter fmt = new DateTimeFormatterBuilder()
          .appendPattern("d/M/")
          .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80))
          .toFormatter();
  parse("13/5/99", fmt);
  parse("13/5/36", fmt);
  parse("13/5/35", fmt);
  parse("13/5/34", fmt);
  parse("13/5/33", fmt);
}

private static void parse(String date, DateTimeFormatter fmt) {
  System.out.println(date + " = " + LocalDate.parse(date, fmt));
}

打印:

13/5/99 = 1999-05-13
13/5/36 = 1936-05-13
13/5/35 = 1935-05-13
13/5/34 = 2034-05-13
13/5/33 = 2033-05-13

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期? 的相关文章

随机推荐

  • java比较器,如何按整数排序?

    我试图学习java中的比较器 我在网上找到了这个很好的例子 我的问题是如何更改这段代码 以便宠物名按年龄和降序排列 以便最老的在第一个 最小的在最后 class Dog implements Comparator
  • 如何在 C++ 中声明指向常量的指针?

    我正在尝试编写一个函数来解析命令行参数 这是函数声明 void parse int char const 以防万一 我也尝试过 const char const char and cchar 用一个typedef const char cc
  • JavaMail 可与 JBOSS Application Server 7 配合使用,但无法与 OpenShift 上的 Tomcat7 配合使用

    package com example web import java io import java util import javax servlet import javax servlet annotation WebServlet
  • 如何制作可编辑的 GridView 模板单元格文本框?

    如何制作可编辑的 GridView 模板单元格文本框 使用命令列并设置ShowEditButton True EditText Edit ButtonType Link 在模板列中 使用 ItemTemplate 来描述列在非编辑模式下的外
  • 在准备好的语句中使用问号占位符时出现 MySQL 语法错误

    尝试了我能想到的一切 我已经将范围缩小到 占位符 我尝试过替换 带有随机文本的占位符 一切都很好 当然除了它不断覆盖同一行 我得到的错误 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 附近使用的正确语法
  • sqlite删除行数

    我需要编写一个 SQLite 查询 该查询将从表中删除 200 以上的行 我认为这会起作用 DELETE FROM tbl names WHERE count gt 200 但这给了我 滥用聚合函数 count 我知道我可以使用一个限制条款
  • 在 postgres 中打印运行时消息

    我们可以使用RAISE NOTICE在 postgres 中相当于RAISERROR 要显示的消息 WITH NOWAIT在 SQL Server 中 或者是否有更好的方法在 postgres 查询运行时打印中间消息 请建议是否有更好的方法
  • lxc 驱动程序不支持 Exec:如何解决这个问题?

    在 CoreOS 上使用 Docker 我有一个脚本调用 docker exec 这在 CoreOS 上工作得很好 但我也想在上面测试一下CircleCI http circleci com 当我尝试在 CircleCI 上运行该脚本时 我
  • java中mongo数据库中所有集合的列表

    如何获取数据库中所有集合的列表 数据库 mongodb 语言 java ide 日食 获取集合列表 每个数据库都有零个或多个集合 您可以从数据库中检索它们的列表 并打印出其中的任何内容 Set
  • 用于散列资产和资源文件夹的文件名的 Angular 构建过程

    我有一个角度 4 4 6应用程序 我使用构建它角度 CLI 1 0 1 我遇到的问题是 除了inline bundle js main bundle polyfills bundle js styles bundle js vendor b
  • x86子指令操作码混淆[重复]

    这个问题在这里已经有答案了 玩了一下 Turbo Assembler 和 Turbo Debugger 我对操作码感到惊讶 更准确地说 我有一些汇编的二进制文件 其中 Turbo Debugger 反汇编了单词 29 C3 正确地sub b
  • 通过构造函数传递实例还是使用静态访问它?

    最近 我一直在使用 Bukkit API 进行编码 但是我的问题与它没有直接关系 在 Bukkit API 中 可以拥有主类的单个实例 new MainClass 引发错误 所以我想知道 使用构造函数将主类传递给我的所有类是否更好 或者我应
  • 在 Python 中使用 Chromedriver 启用 Flash

    尝试使用 python 在 chromedriver 中启用 Adob e Flash Player 我进行了多次尝试 包括 prefs plugins plugins enabled Adobe Flash Player prefs pl
  • 如何像 Windows 10 气球提示一样显示气球提示而不拉伸图标

    我有 WPF 桌面应用程序 它使用以下方式推送一些通知 NotifyIcon ShowBalloonTip ToolTipIcon None 问题是 Windows 10 使用新的 带有图像和文本的 Windows 10 矩形 样式进行气球
  • 在 Google 地图对象上添加 3D 图层

    我想添加一个 3D 图层 在 Google 地图上显示云位置和海拔 这个想法是 当您倾斜地图 在地球模式下按住 Ctrl 键并拖动 时 您可以看到每朵云的高度 我发现这篇文章解释了如何添加 3D 建筑物 但它是 假的 欺骗纬度以获得一些高度
  • 解析数百万个小 XML 文件

    我有 1000 万个小 XML 文件 300KB 500KB 我在 Mapreduce 中使用 Mahaout 的 XML 输入格式来读取数据 并使用 SAX 解析器进行解析 但处理速度非常慢 使用输入文件的压缩 lzo 有助于提高性能吗
  • 为 Magento 属性创建新选项

    我在尝试在 管理选项 选项卡中创建新选项时遇到问题 当您创建属性时 我知道如何将数据正确保存在数据库中 我正在更换Mage Adminhtml Block Catalog Product Attribute Edit Tab Options
  • Reflect.getOwnMetadata 不是具有 karma-typescript 的函数

    我正在尝试进行单元测试 使用 Karma Jasmine 业力打字稿 https www npmjs com package karma typescript 我的 TypeScript 项目 项目结构如下 root src ts all
  • Lucene 与 PHP

    我可以将 Lucene 与 PHP 一起使用吗 我不想使用 Zend 我可以在本机 PHP 非框架 中使用吗 我建议使用阿帕奇SOLR http lucene apache org solr 作为您的 Lucene 后端 并通过 PHP 代
  • 如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期?

    如果我使用类似的模式d M yy用于创建 Java 8 DateTimeFormatter 例如使用DateTimeFormatter ofPattern pattern 我只会用于解析 而不是格式化 它将所有两个字母的年份解释为 20xx