解析Java中的任何日期

2024-02-03

我知道这个问题被问了很多,显然你无法解析任何任意日期。然而,我发现 python-dateutil 库能够解析我扔给它的每个日期,同时在找出日期格式字符串时需要绝对零的努力。 Joda time 始终被认为是一个出色的 Java 日期解析器,但它仍然要求您在选择格式(或创建自己的格式)之前决定日期的格式。您不能只调用 DateFormatter.parse(mydate) 并神奇地取回 Date 对象。

例如,日期“Wed Mar 04 05:09:06 GMT-06:00 2009”可以使用 python-dateutil 正确解析:

import dateutil.parser
print dateutil.parser.parse('Wed Mar 04 05:09:06 GMT-06:00 2009')

但以下 Joda 时间调用不起作用:

    String date = "Wed Mar 04 05:09:06 GMT-06:00 2009";
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
    DateTime dt = fmt.parseDateTime(date);
    System.out.println(date);

创建自己的 DateTimeFormatter 就达不到目的,因为这似乎与使用带有正确格式字符串的 SimpleDateFormatter 相同。

Java 中是否有类似的方法来解析日期,例如 python-dateutil?我不在乎错误,我只希望它基本完美。


您最好的选择实际上是向正则表达式寻求帮助以匹配日期格式模式和/或进行暴力破解。

几年前我写的有点傻DateUtil class http://balusc.blogspot.com/2007/09/dateutil.html哪个完成了这项工作。以下是相关性的摘录:

private static final Map<String, String> DATE_FORMAT_REGEXPS = new HashMap<String, String>() {{
    put("^\\d{8}$", "yyyyMMdd");
    put("^\\d{1,2}-\\d{1,2}-\\d{4}$", "dd-MM-yyyy");
    put("^\\d{4}-\\d{1,2}-\\d{1,2}$", "yyyy-MM-dd");
    put("^\\d{1,2}/\\d{1,2}/\\d{4}$", "MM/dd/yyyy");
    put("^\\d{4}/\\d{1,2}/\\d{1,2}$", "yyyy/MM/dd");
    put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}$", "dd MMM yyyy");
    put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}$", "dd MMMM yyyy");
    put("^\\d{12}$", "yyyyMMddHHmm");
    put("^\\d{8}\\s\\d{4}$", "yyyyMMdd HHmm");
    put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}$", "dd-MM-yyyy HH:mm");
    put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy-MM-dd HH:mm");
    put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}$", "MM/dd/yyyy HH:mm");
    put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}$", "yyyy/MM/dd HH:mm");
    put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMM yyyy HH:mm");
    put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}$", "dd MMMM yyyy HH:mm");
    put("^\\d{14}$", "yyyyMMddHHmmss");
    put("^\\d{8}\\s\\d{6}$", "yyyyMMdd HHmmss");
    put("^\\d{1,2}-\\d{1,2}-\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd-MM-yyyy HH:mm:ss");
    put("^\\d{4}-\\d{1,2}-\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy-MM-dd HH:mm:ss");
    put("^\\d{1,2}/\\d{1,2}/\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "MM/dd/yyyy HH:mm:ss");
    put("^\\d{4}/\\d{1,2}/\\d{1,2}\\s\\d{1,2}:\\d{2}:\\d{2}$", "yyyy/MM/dd HH:mm:ss");
    put("^\\d{1,2}\\s[a-z]{3}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMM yyyy HH:mm:ss");
    put("^\\d{1,2}\\s[a-z]{4,}\\s\\d{4}\\s\\d{1,2}:\\d{2}:\\d{2}$", "dd MMMM yyyy HH:mm:ss");
}};

/**
 * Determine SimpleDateFormat pattern matching with the given date string. Returns null if
 * format is unknown. You can simply extend DateUtil with more formats if needed.
 * @param dateString The date string to determine the SimpleDateFormat pattern for.
 * @return The matching SimpleDateFormat pattern, or null if format is unknown.
 * @see SimpleDateFormat
 */
public static String determineDateFormat(String dateString) {
    for (String regexp : DATE_FORMAT_REGEXPS.keySet()) {
        if (dateString.toLowerCase().matches(regexp)) {
            return DATE_FORMAT_REGEXPS.get(regexp);
        }
    }
    return null; // Unknown format.
}

(咳,双括号初始化,咳,这只是为了让它全部适合 100 个字符的最大长度;))

您可以使用新的正则表达式和日期格式模式轻松地自行扩展它。

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

解析Java中的任何日期 的相关文章

随机推荐

  • signalR python 客户端

    是否有适用于 python 的 serviseR ASP NET CORE 2 0 客户端 我发现了信号库 https pypi python org pypi signalr client 0 0 7但它太旧了 不能与我的 signalR
  • MySql 中的考勤报告

    我想编写一个查询来生成员工的出勤报告 首先 我将告诉您如何将员工的存在存储在我的数据库中 我有以下表格 Employee Table with Columns emp id emp Name Joining Date 1 john 11 0
  • SSL websocket 与 Nginx 无法连接

    获取时遇到问题Nginx to proxy pass使用 websockets 和 SSL WSS NGINX 配置 map http upgrade connection upgrade default upgrade close ser
  • LLDB 可以在 *(&function+offset) 上中断吗?

    我习惯使用 GDB 但我无法使用 LLDB 找到等效的函数 我希望能够将断点放置在距离函数基地址一定的偏移量处 使用 GDB 我可以做到 b 函数X 20 有没有办法用 LLDB 做到这一点 虽然它的格式有点奇怪 但我使用的方法是 b a
  • 使用相对导入动态导入模块的正确方法?

    我需要从另一个包动态地将模块导入到我的项目中 结构如下 project folder project init py main py plugins init py plugin1 init py plugin2 init py 我做了这个
  • 使用 C++ 代码中的 Windows 本机程序打开文件

    我的 C 程序创建 png 文件 我需要在创建后立即打开 查看 该文件 有没有办法打开它 以便在其中打开它Windows资源管理器 因此文件将使用用户首选的程序打开 并且如果没有与文件格式关联的程序 Windows 将显示对话框窗口 用户可
  • 调试错误,nbjpdastart 不支持嵌套的“modulepath”元素

    我正在尝试在 netbeans 8 2 和 JDK 1 8 131 上调试 java 代码 但我不断收到此错误 nbproject build impl xml 1351 执行此行时发生以下错误 nbproject build impl x
  • 如何使用 SystemJS 指定库依赖项?

    Using SystemJS https github com systemjs systemjs 如何指定一个库依赖于另一个库 例如 引导程序 http getbootstrap com JavaScript 库依赖于jQuery htt
  • 一个令牌与多个令牌防止 CSRF 攻击

    我正在使用 Codeigniter 我想防止可能发生的 CSRF 攻击尝试 为了实现这一目标 我向我想要保护的每个表单添加一个带有随机令牌的隐藏输入标记 同时我将此令牌保留在会话中 以便在开始处理此表单数据时进行比较 set a token
  • iOS9 的 Core Image 中的“需要一个 swizzler 以便可以读取 RGB8”是什么意思?

    首先 我想了一个解决办法 但这不是一个好办法 我会在最后给出 当我处理 Filter In 时iOS9我收到 需要一个 swizzler 以便可以读取 RGB8 错误消息 并且通过此方法返回的图像是全黑的 self context crea
  • 有没有办法让 Bitbucket 在每次进行远程 Mercurial 操作时不询问我的密码?

    对于我推送到的所有其他 Mercurial 存储库 我可以在 hgrc 实际上是 Mercurial ini 因为我使用 Windows 中设置用户名和密码 以便在特定域中执行操作 并且 Mercurial 不会提示我进行身份验证信息 然而
  • ProcessPoolExecutor、BrokenProcessPool 处理

    在本文档中 https pymotw com 3 concurrent futures https pymotw com 3 concurrent futures 它说 ProcessPoolExecutor 的工作方式与 ThreadPo
  • CSS 宽度减法

    CSS中如何减去宽度 例如 width 100 10px 我不是在谈论填充或边距 现在与calc https developer mozilla org en US docs Web CSS calc解决方案将是 width calc 10
  • 为什么我的 UIView 没有随着 CGAffineTransformMakeScale 增长?

    我的目标是使视图大小增加一倍 我用我的代码得到的结果是 什么也没发生 视图会显示但不会增长 任何帮助 将不胜感激 Here s the H file Here s the custom method in the M file Here s
  • 为什么使用 http 而不是 https 打开网站时 chrome.runtime 未定义?

    我有一个非常简单的 html 文件 其中包含以下内容 我的页面 html p chrome runtime test p 当我在带有 http 的 Web 服务器中使用这个 html 文件时 chrome runtime 是未定义的 例子
  • 将 JS 与 rollup 和 Babel 捆绑在一起,用于 IE11

    我尝试捆绑两个 JavaScript 模块 以便生成的代码可以在 IE11 中运行 为此 我设置了一个yarn npm项目 它使用rollup js用于捆绑和Babel用于转译 一切正常 直到我添加 非开发 依赖项core js 这里是详细
  • Python 比 Java/C# 慢吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Python 比 Java C 慢吗 性能比较 c java python ruby jython jruby groovy http blog
  • 伊莎贝尔和斯卡拉[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑创建 Eclipse PDE 并且需要与 Isabelle 进行通信 我确实发现一些出版物声
  • 了解 Knuth Morris Pratt (KMP) 失效函数

    我一直在读关于 Knuth Morris Pratt 算法的维基百科文章 http en wikipedia org wiki Knuth E2 80 93Morris E2 80 93Pratt algorithm我对如何在跳转 部分匹配
  • 解析Java中的任何日期

    我知道这个问题被问了很多 显然你无法解析任何任意日期 然而 我发现 python dateutil 库能够解析我扔给它的每个日期 同时在找出日期格式字符串时需要绝对零的努力 Joda time 始终被认为是一个出色的 Java 日期解析器