2011-03-16 16 views
2

我在形式MMM /日/年,即一個字符串。月/ 21/2010 現在我想將它轉換爲yyyyMMdd,即。 20100521.問題轉換日期格式在Java中

我的代碼是:

public static void main(String[] args) {   
     ArrayList<String> dates = new ArrayList<String>(); 
     dates.add("Jan/13/2011"); 
     dates.add("Feb/03/2001"); 
     dates.add("Mar/19/2012"); 
     dates.add("Apr/20/2011"); 
     dates.add("May/21/2010"); 
     dates.add("Jun/23/2008"); 
     dates.add("Jul/12/2009"); 
     dates.add("Aug/14/2010"); 
     dates.add("Sep/01/2011"); 
     dates.add("Oct/07/2010"); 
     dates.add("Nov/05/2011"); 
     dates.add("Dec/30/2011"); 

     for(String s : dates) { 
      System.out.println(transformPrevDate(s)); 
     } 
    } 

和方法進行改造:

public String transformPrevDate(String datoe) { 
     String[] splitter = datoe.split("/"); 
     String m = splitter[0].toUpperCase(); 
     String d = splitter[1]; 
     String y = splitter[2]; 

     DateFormat formatter = new SimpleDateFormat("MMM"); 
     DateFormat formatter2 = new SimpleDateFormat("MM"); 

     try { 
      Date date = formatter.parse(m); 
      m = formatter2.format(date); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     String date = y + m + d; 

     return date; 
    } 

的問題是,我得到一個無法解析的日期例外,5月日和10月從我丹麥,如果我將它改爲丹麥語「Maj」和「Okt」,它會成功。那麼我在這裏做錯了什麼?

回答

2

使用SimpleDateFormat(String pattern, Locale locale)Locale添加到您的日期解析(英語,用Locale.ENGLISH)。

更好的解決方案:

public String transformPrevDate(String datoe) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH); 
    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMMdd"); 

    try { 
     return dateFormat2.format(dateFormat.parse(datoe)); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
2

您需要申請the locale on SimpleDateFormat

這裏有一個更短的版本: -

public String transformPrevDate(String date) { 
    DateFormat oldFormat = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH); 
    DateFormat newFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH); 

    String formattedDate = ""; 

    try { 
     formattedDate = newFormat.format(oldFormat.parse(date)); 
    } 
    catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    return formattedDate; 
} 

@Test 
public void testTransformPrevDate() { 
    assertEquals("20110113", transformPrevDate("Jan/13/2011")); 
    assertEquals("20010203", transformPrevDate("Feb/03/2001")); 
} 
1

使用SimpleDateFormat(String pattern, Locale locale);

1

SimpleDateFormat語言環境相關,並且它使用自己的語言環境默認。如果你想使用基於英語的語言環境中,您可以通過passing in a Locale when you create your SimpleDateFormat創建它。

所以要使用美國的語言環境,改變你的SimpleDateFormat初始化:

DateFormat formatter = new SimpleDateFormat("MMM", Locale.US); 
    DateFormat formatter2 = new SimpleDateFormat("MM", Locale.US); 
0

SimpleDateFormat使用您的語言環境 - 讓你的電腦可能是設置爲默認使用丹麥語。明確指定的英語語言環境:

DateFormat formatter = new SimpleDateFormat("MMM", Locale.ENGLISH); 
4

transformDate方法可以更簡單寫成這樣:

DateFormat input = new SimpleDateFormat("MMM/dd/yyyy", Locale.ENGLISH); 
DateFormat output = new SimpleDateFormat("yyyyMMdd"); 
public String transformPrevDate(String datoe) throws ParseException { 
    return output.format(input.parse(datoe)); 
} 

你不需要做你自己的分析。

+0

+1更好的解決方案! – 2011-03-16 14:42:43

+1

僅供參考......你仍然需要將其包裝在try-catch塊或不得不拋出ParseException,因爲'input.parse(datoe)'拋出ParseException的,這是一個檢查異常的API。 – limc 2011-03-16 14:53:24