Java中日期格式的检测

Java中日期格式的检测,java,datetime,date-parsing,Java,Datetime,Date Parsing,我从各种API抓取日期,比如G+FB和Skype,我有一个下面的函数,我从 private static final Map DATE\u FORMAT\u REGEXPS=new HashMap(){{ put(“^\\d{8}$”,“yyyyMMdd”); put(“^\\d{1,2}-\\d{1,2}-\\d{4}$”,“dd-MM-yyyy”);//1990年8月24日 put(“^\\d{4}-\\d{1,2}-\\d{1,2}$”,“yyyy-MM-dd”); put(“^\\d{1

我从各种API抓取日期,比如G+FB和Skype,我有一个下面的函数,我从

private static final Map DATE\u FORMAT\u REGEXPS=new HashMap(){{
put(“^\\d{8}$”,“yyyyMMdd”);
put(“^\\d{1,2}-\\d{1,2}-\\d{4}$”,“dd-MM-yyyy”);//1990年8月24日
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}$”,“yyy/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”);
放置(“^\\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”);
放置(“^\\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”);
}};
公共字符串determineDateFormat(字符串日期字符串){
for(字符串regexp:DATE\u FORMAT\u REGEXPS.keySet()){
if(dateString.toLowerCase().matches(regexp)){
返回日期\格式\ REGEXPS.get(regexp);
}
}
返回“未知格式”;//未知格式。
}

它适用于大多数日期格式,尽管我遇到的日期是:1990年8月24日。我想知道这是哪种日期格式?MM DD YYYY还是什么?还有任何提示,以便我可以将其添加到已指定的正则表达式中吗

您是否尝试过为此使用特定的库?当我处理来自外部API的随机日期格式时,我发现Natty对我非常有用

您也可以在站点上以交互形式进行尝试,在决定将其与代码集成之前,查看它可以处理什么和不能处理什么


1990年8月24日的模式是“MMM-dd,yyyy”,并使用en-Locale。

我对使用库持怀疑态度,我不想增加.apk的大小,因为我已经有太多SDK的俱乐部。有没有更简单的方法?嗯,如果你不想使用库,那么我想你只需要在需要的时候不断向列表中添加更多的正则表达式。“mmmdd,yyyy”是返回字符串的正确格式,但我将把regexp留给您,因为它不是我的强项
put(“^[a-z]{3}\\d[1,2},\\d{4}$”,“MMM dd,yyyy”)
;搜索java模式API文档,您会发现regex的描述。Map在这里有点滥用数据结构;
^…$
可能是
..
.a
列表
字符串[]
可以。您还可以立即返回日期、null或日期链接集(按检索顺序匹配日期)使用parse。我不太擅长正则表达式,从Learn regex中学到了很多东西。让我试试你的建议,非常感谢:)它给了我一个java.util.regex.PatternSyntaxException:索引25附近的字符类缺少结束括号:改为试试这个正则表达式:
^[a-z]{3}\\s\\d{2},\\s\\d{4}$
Sam将此作为回答,我接受!如何将其转换为YYYY-MM-DD?日期d=新的SimpleDataFormat(“MM-DD,YYYY”,Locale.US)。解析(“1990年8月24日”);字符串str=新的java.sql.Date(d.getTime()).toString();
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"); //Aug 24, 1990
        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");
    }};



    public String determineDateFormat(String dateString) {
        for (String regexp : DATE_FORMAT_REGEXPS.keySet()) {
            if (dateString.toLowerCase().matches(regexp)) {
                return DATE_FORMAT_REGEXPS.get(regexp);
            }
        }
        return "Unknown Format"; // Unknown format.
    }