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

解析Java中的任何日期

越星晖
2023-03-14
问题内容

我知道这个问题已经问了很多,显然你不能解析任何日期。但是,我发现python-dateutil库能够解析我向它抛出的每个日期,而在找出日期格式字符串方面绝对需要零的工作。Joda time始终被当作是出色的Java日期解析器而出售,但是它仍然需要你在选择格式(或创建自己的格式)之前确定日期的格式。你不能只调用DateFormatter.parse(mydate)并神奇地获取Date对象。

例如,日期“ Wed Mar 04 05:09:06 GMT-06:00 2019”已使用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 2019";
    DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
    DateTime dt = fmt.parseDateTime(date);
    System.out.println(date);

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

有没有类似的方法可以在Java中解析日期,例如python-dateutil?我不在乎错误,我只是希望它能完美实现。


问题答案:

最好的选择是向正则表达式寻求帮助以匹配日期格式模式和/或进行强行强制。

几年前,我写了一个DateUtil课程来完成这项工作。这是相关的摘录:

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个字符的长度;))

你可以使用新的regex和dateformat模式轻松地自己扩展它。



 类似资料:
  • 问题内容: 我从服务器收到了JSON数组。我获得一个日期作为时间戳字符串(例如),并且我需要将其解析为我们的日格式。我该怎么做呢?我曾尝试过,但我总是将年份定为1970。 注意:我的JSON格式是UNIX。 在另一个类中,我解析时间戳以显示它: 但是,显示的日期始终是1970。 使用看起来像预期的那样的值(它显示一个现代日期)。 问题答案: 如果您正确解析JSON, 保留您的日期。您正在以Stri

  • 问题内容: 我正在尝试解析此日期,但无法正常工作: 如果我使用strDate =尝试此代码,我将获得肯定的答案。有什么问题?如何解析这种格式? PS。我从那里得到了这个日期,并且没有关于用户选择日期时如何修改日期格式的说明。 问题答案: 你不能期望使用设置为其他格式的SimpleDateFormat解析日期。 要解析“ 2009年Thu Jun 18 20:56:02 EDT 2019”日期字符串

  • 问题内容: 到目前为止,我一直在使用Cobra,因为它很容易,但是不幸的是,它在一些测试用例中存在一些问题。有人建议使用经过测试的库吗? 我尝试了Cobra内置的HTMLCleaner并没有运气。 问题答案: Mozilla HTML Parser 看起来很有趣。根据定义,它应该和Gecko引擎本身一样好,这很可能满足您的需

  • 我正在开发一个应用程序,它应该接受任意格式的日期 - 换句话说,如果它像日期一样走路,像日期一样说话,它就是一个日期。 我试图调整moment.js包中的日期格式解析器以生成格式字符串并取得部分成功,但遇到了输入字符串中包含一些无法识别的元素的情况。 例如,似乎没有合适的格式来处理字符串 - 或者,至少有一个对我来说似乎很清楚,但也许我在文档中遗漏了一些东西。 我看了https://pub.dev

  • 问题内容: SimpleDateFormat是一种非常友好的解析器,它滚动结果日期而不是抛出错误。如何在没有正则表达式等的情况下严格解析日期? 问题答案: 是您要寻找的。

  • 问题内容: 我的日期格式为dd-mmm-yy或d- mmm-y,其中月份是字母的缩写(例如,09年11月4日或05年12月12日等)。喜欢解析它以产生一个java.util.Date对象。 可以通过利用java.text.DateFormat类来实现吗?还是有另一种简单的方法? 问题答案: 您可能需要使用SimpleDateFormat来解析自定义格式。此文章解释格式的细节。