如何使用java检测给定的日期格式

时间:2012-07-03 11:35:15

标签: java localdate

我有一个获取字符串并将其更改为特定日期格式的方法,但事情是日期将是任何格式 例如

16 July 2012

March 20 2012

2012 March 20

所以我需要检测字符串是以哪种文件格式。

我使用下面的代码来测试它,但是如果文件格式发生变化,我会遇到异常。

private String getUpdatedDate(String updated) {
        Date date;
        String formatedDate = null;
        try {
            date = new SimpleDateFormat("d MMMM yyyy", Locale.ENGLISH)
                    .parse(updated);
            formatedDate = getDateFormat().format(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return formatedDate;
    }

8 个答案:

答案 0 :(得分:3)

也许最简单的解决方案是构建一个您可以合理预期的日期格式集合,然后依次尝试针对每个格式的输入。

您可能想要标记不明确的输入,例如是6月5日或5月6日的2012/5/6?

答案 1 :(得分:3)

如果你正在使用Joda Time(很棒的库btw),你可以很容易地做到这一点:

DateTimeParser[] dateParsers = { 
        DateTimeFormat.forPattern("yyyy-MM-dd HH").getParser(),
        DateTimeFormat.forPattern("yyyy-MM-dd").getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append(null, dateParsers).toFormatter();

DateTime date1 = formatter.parseDateTime("2012-07-03");
DateTime date2 = formatter.parseDateTime("2012-07-03 01");

答案 2 :(得分:2)

BalusC写了一个简单的DateUtil,它适用于很多情况。您可能需要对其进行扩展以满足您的要求。

以下是链接:http://balusc.blogspot.in/2007/09/dateutil.html

以及您需要查找determineDateFormat()

的方法

答案 3 :(得分:2)

Apache commons有一个实用方法来解决这个问题。 org.apache.commons.lang.time.DateUtils类有一个方法parseDateStrictly

   public static Date parseDateStrictly(String str,
                                         String[] parsePatterns)
                                  throws ParseException

 Parameters:
        str - the date to parse, not null
        parsePatterns - the date format patterns to use, see SimpleDateFormat, not null

通过尝试各种不同的解析器来解析表示日期的字符串。

解析将依次尝试每个解析模式。如果解析整个输入字符串,则认为解析成功。如果没有解析模式匹配,则抛出ParseException。

解析器严格解析 - 它不允许诸如“February 942,1996”之类的日期。

答案 4 :(得分:0)

确定预期的格式,并尝试使用每种格式一个接一个地解析日期。只要其中一种格式毫无例外地解析日期就停止。

答案 5 :(得分:0)

Click to see the result

使用正则表达式解析字符串的日期。此正则表达式可以检测任何类型的日期格式。这里的示例代码还不包括时间。您可以更改代码以添加日期的更多部分,例如时间和时区...月份名称取决于系统的默认语言区域设置。

import java.io.IOException;
import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateUtils {

    static String MONTH="";
    static String dateRegEx="";
    static Pattern DatePattern; 
    static HashMap<String, Integer> monthMap = new HashMap<String, Integer>();
    static {
        initializeMonthName();
        dateRegEx="(?i)(\\d{1,4}|"+MONTH+")[-|/|.|\\s+]?(\\d{1,2}|"+MONTH+")[-|/|.|,]?[\\s+]?(\\d{1,4}|"+MONTH+")[\\s+|\\t|T]?(\\d{0,2}):?(\\d{0,2}):?(\\d{0,2})[.|,]?[\\s]?(\\d{0,3})?([+|-])?(\\d{0,2})[:]?(\\d{0,2})[\\s+]?([A|P]M)?";
        DatePattern = Pattern.compile(dateRegEx);
    }

    private static void initializeMonthName() {
        String[] monthName=getMonthString(true);
        for(int i=0;i<12;i++){
            monthMap.put(monthName[i].toLowerCase(), Integer.valueOf(i+1));
        }

        monthName=getMonthString(false);
        for(int i=0;i<12;i++){
            monthMap.put(monthName[i].toLowerCase(), Integer.valueOf(i+1));
        }

        Iterator<String> it = monthMap.keySet().iterator();
        while(it.hasNext()){
            String month=it.next();
            if(MONTH.isEmpty()){
                MONTH=month;
            }else{
                MONTH=MONTH + "|" + month;
            }
        }
    }

    public static boolean isInteger(Object object) {
        if(object instanceof Integer) {
            return true;
        } else {
            try{
                Integer.parseInt(object.toString());
            }catch(Exception e) {
                return false;
            }           
        } 
        return true;
    }

    public static String[] getMonthString(boolean isShort) {
        DateFormatSymbols dfs = new DateFormatSymbols();
        if (isShort) {
         return dfs.getShortMonths();
        } else {
            return dfs.getMonths();
        }
    }

    public static int getMonthMap(String value) {

        if(monthMap.get(value)==null){
            return 0;
        }
        return monthMap.get(value).intValue();      
    }

    public static long parseDate(String value){

        Matcher matcher = DatePattern.matcher(value);
        int Year=0, Month=0, Day=0; 
        boolean isYearFound=false;
        boolean isMonthFound=false;
        boolean isDayFound=false;
        if(matcher.find()) {            
            for(int i=1;i<matcher.groupCount();i++){
                String data=matcher.group(i)==null?"":matcher.group(i); 
                if(data.equalsIgnoreCase("null")){
                    data="";
                }
                //System.out.println(String.valueOf(i) + ": " + data);
                switch(i){
                case 1:
                    if(!data.isEmpty()){
                        if(isInteger(data)){
                            Integer YMD = Integer.valueOf(data);
                            if(YMD==0){
                                return 0;
                            }
                            if(YMD>31){
                                Year = YMD.intValue();
                                isYearFound = true;
                            }else if(YMD>12){
                                Day = YMD.intValue();
                                isDayFound = true;
                            }else {
                                Month=YMD.intValue();
                                isMonthFound=true;
                            }
                        }else {
                            Month = getMonthMap(data.toLowerCase());
                            if(Month==0){
                                return 0;
                            }
                            isMonthFound=true;
                        }
                    }else {
                        return 0;
                    }
                    break;
                case 2:
                    if(!data.isEmpty()){
                        if(isInteger(data)){                            
                            Integer YMD = Integer.valueOf(data);
                            if(YMD==0){
                                return 0;
                            }

                            if(YMD>31){
                                if(isYearFound) {
                                    return 0;
                                }
                                Year = YMD.intValue();
                                isYearFound = true;
                            }else if(YMD>12){
                                if(isDayFound) {                                    
                                    return 0;
                                }
                                Day = YMD.intValue();
                                isDayFound = true;
                            }else {                             
                                if(isMonthFound){
                                    Day=YMD.intValue();
                                    isDayFound=true;
                                }else{
                                    Month=YMD.intValue();
                                    isMonthFound=true;
                                }
                            }
                        }else {
                            if(isMonthFound){
                                Day=Month;
                                isDayFound=true;
                            }
                            Month = getMonthMap(data.toLowerCase());
                            if(Month==0){
                                return 0;
                            }

                            isMonthFound=true;
                        }
                    }else {
                        return 0;
                    }
                    break;
                case 3:
                    if(!data.isEmpty()){
                        if(isInteger(data)){

                            Integer YMD = Integer.valueOf(data);
                            if(YMD==0){
                                return 0;
                            }
                            if(YMD>31){
                                if(isYearFound) {
                                    return 0;
                                }
                                Year = YMD.intValue();
                                isYearFound = true;
                            }else if(YMD>12){
                                if(isDayFound) {
                                    return 0;
                                }
                                Day = YMD.intValue();
                                isDayFound = true;
                            }else {
                                if(isMonthFound){
                                    Day=YMD.intValue();
                                    isDayFound=true;                                    
                                }else {
                                    Month = YMD.intValue();
                                    isMonthFound=true;
                                }

                            }
                        }else {
                            if(isMonthFound){
                                Day=Month;
                                isDayFound=true;
                            }
                            Month = getMonthMap(data.toLowerCase());
                            if(Month==0){
                                return 0;
                            }
                            isMonthFound=true;
                        }
                    }else {
                        return 0;
                    }
                    break;
                case 4:
                //hour
                    break;
                case 5:
                //minutes
                    break;
                case 6:
                //second
                    break;
                case 7:
                //millisecond
                    break;
                case 8:
                //time zone +/-
                    break;
                case 9:
                //time zone hour
                    break;
                case 10:
                // time zone minute
                    break;
                case 11:
                //AM/PM
                    break;
                }

            }           
        }

        Calendar c = Calendar.getInstance();
        c.set(Year, Month-1, Day, 0, 0); 
        return c.getTime().getTime();
    }


    public static void main(String[] argv) throws IOException {

        long d= DateUtils.parseDate("16 July 2012");
        Date dt = new Date(d);
        SimpleDateFormat df2 = new SimpleDateFormat("d MMMM yyyy");
        String dateText = df2.format(dt);
        System.out.println(dateText);

        d= DateUtils.parseDate("March 20 2012");
        dt = new Date(d);
        dateText = df2.format(dt);
        System.out.println(dateText);        

        d= DateUtils.parseDate("2012 March 20");
        dt = new Date(d);
        dateText = df2.format(dt);
        System.out.println(dateText);  
    }

}

答案 6 :(得分:0)

 public static String detectDateFormat(Context context, String inputDate, String requiredFormat) {
    String tempDate = inputDate.replace("/", "").replace("-", "").replace(" ", "");
    String dateFormat = "";

    if (tempDate.matches("([0-12]{2})([0-31]{2})([0-9]{4})")) {
        dateFormat = "MMddyyyy";
    } else if (tempDate.matches("([0-31]{2})([0-12]{2})([0-9]{4})")) {
        dateFormat = "ddMMyyyy";
    } else if (tempDate.matches("([0-9]{4})([0-12]{2})([0-31]{2})")) {
        dateFormat = "yyyyMMdd";
    } else if (tempDate.matches("([0-9]{4})([0-31]{2})([0-12]{2})")) {
        dateFormat = "yyyyddMM";
    } else if (tempDate.matches("([0-31]{2})([a-z]{3})([0-9]{4})")) {
        dateFormat = "ddMMMyyyy";
    } else if (tempDate.matches("([a-z]{3})([0-31]{2})([0-9]{4})")) {
        dateFormat = "MMMddyyyy";
    } else if (tempDate.matches("([0-9]{4})([a-z]{3})([0-31]{2})")) {
        dateFormat = "yyyyMMMdd";
    } else if (tempDate.matches("([0-9]{4})([0-31]{2})([a-z]{3})")) {
        dateFormat = "yyyyddMMM";
    } else {

    }
    try {
        String formattedDate = new SimpleDateFormat(requiredFormat, Locale.ENGLISH).format(new SimpleDateFormat(dateFormat).parse(tempDate));
        Toast.makeText(context, formattedDate, Toast.LENGTH_SHORT).show();
        return formattedDate;
    } catch (Exception e) {
        Toast.makeText(context, "Please check the date format", Toast.LENGTH_SHORT).show();
        return "";
    }

}

答案 7 :(得分:0)

我也在某些地方遇到了这个问题:

  1. 我做了同样的事情,收集了符合我需要的格式。
  2. 更新了我的sql查询,使其以一种我可以轻松解析的格式返回日期。在查询TO_CHAR(o.CREATE_TS,'MM-DD-YYYY')中使用了 &在转换为其他所需格式时,使用了Java中的“ MM-dd-yyyy”来解析并更改为所需格式。

希望#2会在最少的情况下为您提供帮助。