Java 将字符串转换为日期(复杂时区)

Java 将字符串转换为日期(复杂时区),java,string,datetime,jodatime,Java,String,Datetime,Jodatime,我有非常不规则的约会,比如: 2012年1月9日星期一14:18:32-0800(格林尼治标准时间) 2006年10月18日00:32:03-0000 Sat,2006年11月18日19:52:23 UT 我做了一个非常复杂的函数来完成这一切,它可以工作,但是为了学习,我想用try-and-catch再次完成它。 我的问题是,我如何处理时区?你可以在我的函数中看到所有的时区,但是我也有一些时间(…作为一个时区,例如,我不想把所有的大小写都存储在一个字符串数组中 我还想使用(可以是localDat

我有非常不规则的约会,比如:

2012年1月9日星期一14:18:32-0800(格林尼治标准时间)

2006年10月18日00:32:03-0000

Sat,2006年11月18日19:52:23 UT

我做了一个非常复杂的函数来完成这一切,它可以工作,但是为了学习,我想用try-and-catch再次完成它。 我的问题是,我如何处理时区?你可以在我的函数中看到所有的时区,但是我也有一些时间(…作为一个时区,例如,我不想把所有的大小写都存储在一个字符串数组中

我还想使用(可以是localDate或dateTime,对我来说没那么重要)

public LocalDate handleDate(字符串日期){
字符串[]天={“周一”、“周二”、“周三”、“周四”、“周五”、“周六”、“周日”};
字符串[]月={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”,
“八月”、“九月”、“十月”、“十一月”、“十二月”};
字符串[]年={“2004”、“2005”、“2006”、“2007”、“2008”、“2009”,
"2010", "2011", "2012" };
//顺序非常重要!!(例如,MEST必须在EST之前)
字符串[]时区={“BST”、“CET”、“CEST”、“CST”、“CDT”、“EDT”,
“GMT+00:00”、“GMT”、“IST”、“MEST”、“EST”、“MET”、“MDT”、“PST”,
“PDT”、“SAST”、“UTC”、“UT”、“西欧标准时间”,
“西欧罗巴(佐默蒂德)”;
字符串origDate=日期;
字符串时区=”;
字符串年份=”;
字符串月份=”;
字符串日期=”;
整小时=0;
整数分钟=0;
整数秒=0;
//它有效吗?
日期=修剪(日期);
如果(日期等于(“”){
返回null;
}
//首先删除一天之后的逗号
date=date.replaceAll(“,”和“”);
//取消这一天
对于(int i=0;i=1;i--){
//首先检查包含2个数字的数字(如07)
字符串d=nf(i,2);
如果(日期包含(d)){
日=nf(i,2);
日期=日期。替换(d,“”);
打破
}
//检查是否有1位数字
d=”“+i;
如果(日期包含(d)){
日=nf(i,2);
日期=日期。替换(d,“”);
打破
}
}
//除了空白,应该什么都没有了
日期=日期。替换(“,”);
如果(日期等于(“”==false){
println(“handleDate:输入有问题\n”+日期);
println(origDate+“\n”);
println(年);
println(月);
println(日);
}
//字符串cleanDate=day+“/”+month+“/”+year+“”+nf(小时,
//2)+“:”+nf(分钟,2)+“:”+nf(秒,2);
//DateTimeFormatter格式化程序=
//模式的日期时间格式(“dd/MMM/yyyy HH:mm:ss”);
字符串cleanDate=年+“-”+月+“-”+日;
DateTimeFormatter formatter=DateTimeFormat.forPattern(“yyyy MMM dd”);
试一试{
//DateTime dt=格式化程序.parseDateTime(cleanDate);
//LocalDate dt=新的LocalDate(cleanDate);
//返回dt.toLocalDate();
//返回dt;
//返回新的LocalDate().parse(cleanDate,格式化程序);
返回格式化程序.parseLocalDate(cleanDate);
}抓
public LocalDate handleDate(String date) {

        String[] days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
        String[] months = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
                "Aug", "Sep", "Oct", "Nov", "Dec" };
        String[] years = { "2004", "2005", "2006", "2007", "2008", "2009",
                "2010", "2011", "2012" };

        // ORDER IS VERRY IMPORTANT!! ( MEST must be before EST for example)
        String[] timesZones = { "BST", "CET", "CEST", "CST", "CDT", "EDT",
                "GMT+00:00", "GMT", "IST", "MEST", "EST", "MET", "MDT", "PST",
                "PDT", "SAST", "UTC", "UT", "W. Europe Standard Time",
                "West-Europa (zomertijd)" };

        String origDate = date;

        String timeZone = "";
        String year = "";
        String month = "";
        String day = "";
        int hours = 0;
        int minutes = 0;
        int seconds = 0;

        // is it valid?
        date = trim(date);
        if (date.equals("")) {
            return null;
        }

        // first delete the comma that comes mostly after the day
        date = date.replaceAll(",", "");

        // remove the day
        for (int i = 0; i < days.length; i++) {
            if (date.contains(days[i])) {
                date = date.replace(days[i], "");
                break;
            }
        }

        // if(date.contains("23:27:17")) println(date);

        for (int i = 0; i < timesZones.length; i++) {
            // first check with '(' and ')'
            String target = "(" + timesZones[i] + ")";

            if (date.contains(target)) {
                timeZone = timesZones[i];
                date = date.replace(target, "");
                break;
            }

            // if not found check without '(' and ')'
            if (date.contains(timesZones[i])) {
                timeZone = timesZones[i];
                date = date.replace(timesZones[i], "");
                break;
            }
        }

        // get the month
        for (int i = 0; i < months.length; i++) {
            if (date.contains(months[i])) {
                month = months[i].toLowerCase(); // !must be lowercase
                // must be dutch on my pc
                if (month.equals("oct"))
                    month = "okt";
                if (month.equals("may"))
                    month = "mei";
                if (month.equals("mar"))
                    month = "mrt";

                date = date.replace(months[i], "");
                break;
            }
        }

        // get the year
        for (int i = 0; i < years.length; i++) {
            if (date.contains(years[i])) {
                year = years[i];
                date = date.replace(years[i], "");
                break;
            }
        }

        // get the time
        Pattern p = Pattern.compile("(\\d\\d):(\\d\\d):(\\d\\d)");
        Matcher m = p.matcher(date);
        if (m.find()) {
            // also fix the time, 00 is not allowed

            hours = Integer.parseInt(m.group(1));
            minutes = Integer.parseInt(m.group(2));
            seconds = Integer.parseInt(m.group(3));

            date = date.replaceAll("(\\d\\d:\\d\\d:\\d\\d)", "");
        }

        // get the time difference
        date = date.replace("+-", "+0"); // bug fix where data is incorrect ( 16
                                            // Sep 2007 23:27:17 +-200)

        p = Pattern.compile("[+|-]*(\\d\\d)\\d\\d");
        m = p.matcher(date);
        if (m.find()) {
            int timeDifferenceH = Integer.parseInt(m.group(1));

            date = date.replaceAll("([+|-]*\\d\\d\\d\\d)", "");
        }

        date = " " + date; // bug fix

        // get the day
        for (int i = 31; i >= 1; i--) {
            // first check for the ones that contains 2 digits (like 07)
            String d = nf(i, 2);
            if (date.contains(d)) {
                day = nf(i, 2);
                date = date.replace(d, "");
                break;
            }

            // check for 1 digit
            d = "" + i;
            if (date.contains(d)) {
                day = nf(i, 2);
                date = date.replace(d, "");
                break;
            }
        }

        // there should be nothing left except white space
        date = date.replace(" ", "");
        if (date.equals("") == false) {
            println("handleDate: problem with input\n" + date);
            println(origDate + "\n");
            println(year);
            println(month);
            println(day);
        }

        // String cleanDate = day + "/" + month + "/" + year + " " + nf(hours,
        // 2) + ":" + nf(minutes, 2) + ":" + nf(seconds, 2);
        // DateTimeFormatter formatter =
        // DateTimeFormat.forPattern("dd/MMM/yyyy HH:mm:ss");

        String cleanDate = year + "-" + month + "-" + day;
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MMM-dd");

        try {

            // DateTime dt = formatter.parseDateTime(cleanDate);
            // LocalDate dt = new LocalDate(cleanDate);
            // return dt.toLocalDate();
            // return dt;
            // return new LocalDate().parse(cleanDate, formatter);
            return formatter.parseLocalDate(cleanDate);
        } catch (IllegalArgumentException iae) {
            println("handleDate: Problem with formatting: " + cleanDate);
        }

        return null;
    }