2011-03-16 34 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