【问题标题】:convert irregular dates转换不规则日期
【发布时间】:2026-01-19 04:30:02
【问题描述】:

我得到了一个这样的不规则日期列表:

格林威治标准时间 2005 年 9 月 29 日星期四 17:52:45

2005 年 8 月 17 日,星期三 21:21:08 +0200

2005 年 8 月 17 日,星期三 20:08:22 +0200

2005 年 8 月 15 日星期一 21:44:07 +0200

2005 年 7 月 24 日星期日 21:47:09 +0200

2005 年 7 月 24 日星期日 12:37:46 -0700(太平洋夏令时间)

2005 年 7 月 24 日星期日 21:37:51 +0200

2005 年 7 月 11 日星期一 21:19:38 +0200

2005 年 7 月 11 日星期一 21:19:02 +0200

2005 年 7 月 11 日星期一 20:43:08 +0200 (CEST)

2006 年 11 月 13 日 14:06:20 +0000

如何使用 JodaTime 或默认的 java 日期类将它们转换为 DateTime 或只是 Time? (乔达时间首选)。

【问题讨论】:

  • 他们是Strings 还是Dates?

标签: java datetime jodatime


【解决方案1】:

每个人都在关注某个DateFormat。准备一个chain (chain of responsibility pattern) 的预定义 DateFormat 处理程序,并将您拥有的日期字符串传递到链中。让适当的处理程序解析日期并为您返回日期。

注意:这是假设您发布的日期以字符串格式可供您使用。如果您有 java.util.Date 对象,那么我相信您看到的是显示时间格式。

【讨论】:

    【解决方案2】:

    我不知道哥们怎么用jodatime来做,但你能做的就是使用

    字符串模式 = "MM/dd/yyyy";

    SimpleDateFormat 格式 = new SimpleDateFormat(pattern);

    【讨论】:

      【解决方案3】:

      Pangea 当我读到你的消息时我很累,我想发布解决方案,然后我把它读了回来,现在我意识到我可以通过尝试和返回 null 或尝试不同的模式来更轻松地完成它.

      无论如何,这是一个艰难的解决方案:

      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"
      };
      
      
      // 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)"
      };
      
      DateTime handleDate(String date) {
      
        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 = int(m.group(1));
          minutes = int(m.group(2));
          seconds = int(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 = int(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");
      
        try {
            DateTime dt = formatter.parseDateTime(cleanDate);
            return dt;
          } catch (IllegalArgumentException iae) {
            println("handleDate: Problem with formatting: "+cleanDate);
          }
      
        return null;  
      }
      

      【讨论】: