2017-06-01 156 views
4

我有类从其他类接收字符串格式的日期。它现在接收两个不同的格式基于字符串选择日期格式

格式1:YYYY_MM_DD

格式2:EEE MMM DD HH:MM:SSžYYYY

现在我想写接收到该字符串的方法,并将其转换进入这样的“DDMMMYYYY”

+1

您的意思是可以处理format1和format2然后导致DDMMMYYYY? –

+0

@ΦXocę웃Пepeúpaツ是的,确切地说 – Raj

+0

我宁愿使用两个'DateTimeFormatter'对象。尝试使用其中一个解析为“LocalDate”,如果抛出DateTimeParseException,则使用另一个解析。最后使用第三种格式转换为所需的格式。记住:年份是小写'yyyy'或'uuuu',月份的日期是小写'dd'。并给你的格式化器适当的区域设置。 –

回答

4

要求的格式,您可以尝试蛮力解析捕获异常:

编辑:

使用java8 API(适应的格式,因为你需要/想)

public String convertDateFormatJ8(String format) { 
    String retFormat = "ddMMyyy"; 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy_dd_MM][yyyy-MM-dd HH:mm]"); 
    try { 
     LocalDateTime localDate = LocalDateTime.parse(format, formatter); 
     return localDate.format(DateTimeFormatter.ofPattern(retFormat)); 
    } catch (DateTimeParseException ex) { 
     System.err.println("impossible to parse to yyyy-MM-dd HH:mm"); 
    } 
    try { 
     LocalDate localDate = LocalDate.parse(format, formatter); 
     return localDate.format(DateTimeFormatter.ofPattern(retFormat)); 
    } catch (DateTimeParseException ex) { 
     System.err.println("impossible to parse to yyyy_dd_MM"); 
    } 

    return null; 

} 

老的Java版本

public String convertDateFormat(String format) { 
     DateFormat df1 = new SimpleDateFormat("YYYY_MM_DD"); 
     DateFormat df2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
     DateFormat dfResult = new SimpleDateFormat("DDMMMYYYY "); 
     Date d = null; 
     try { 
      d = df1.parse(format); 
      return dfResult.format(d); 
     } catch (ParseException e) { 
      System.err.println("impossible to parse to " + "YYYY_MM_DD"); 
     } 
     try { 
      d = df2.parse(format); 
      return dfResult.format(d); 
     } catch (ParseException e) { 
      System.err.println("impossible to parse to " + "EEE MMM dd HH:mm:ss z yyyy"); 
     } 
     return null; 
    } 

如果你给其他任何无效的字符串,返回的字符串将是空的!

+1

你错过了将日期转换为像DDMMMYYYY这样的字符串的第三个DateFormat ;-) – aexellent

+0

Holy pattern,Thanks !! –

+0

请不要教年轻人使用过时的SimpleDateFormat和朋友。今天我们好多了。例如见[Andriy Rymar的回答](https://stackoverflow.com/a/44302191/5772882)。 –

3

您可以使用此方法,并在图案声明可选部分:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[yyyy_MM_dd][EEE MMM dd HH:mm:ss Z yyyy]", Locale.ENGLISH); 

formatter将解析日期为两个模式,然后你可以很容易地将其转换为所需要的格式。

P.S.我已经测试过它,但不知道哪个日期应该可以解析为EEE MMM dd HH:mm:ss Z yyyy模板。因此,只需使用它并使用Java 8方法(Java时间)

+0

[这里是](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)解释如何使用它。 –

+1

在格式模式字符串中,第一种格式应该写为yyyy_MM_dd,小写字母y和d(大写字母Y代表以周为单位的年份,仅在周数中有用;大写字母D代表年份中的日期)。 –

+0

@AndriyRymar As Ole V.V.评论,你在这个答案中的代码*非常*破碎。请修复或删除。 –