2

MMM / dd/yyyyの形式の文字列があります。2010年5月21日。今、私はそれをyyyyMMddに変換したいと思います。20100521。

私のコードは次のとおりです。

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」に変更すると成功します。それで、私はここで何を間違っているのですか?

4

6 に答える 6

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));
}

自分で構文解析を行う必要はありません。

于 2011-03-16T14:41:22.233 に答える
2

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"));
}
于 2011-03-16T14:33:19.423 に答える
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();
    }
}
于 2011-03-16T14:35:55.437 に答える
1

使用SimpleDateFormat(String pattern, Locale locale);

于 2011-03-16T14:33:25.027 に答える
1

SimpleDateFormatロケールに依存し、デフォルトで独自のロケールを使用します。英語ベースのロケールを使用する場合は、を作成するときにを渡すことでLocale作成できますSimpleDateFormat

したがって、米国ベースのロケールを使用するには、SimpleDateFormat初期化を次のように変更します。

    DateFormat formatter = new SimpleDateFormat("MMM", Locale.US);
    DateFormat formatter2 = new SimpleDateFormat("MM", Locale.US);
于 2011-03-16T14:33:48.700 に答える
0

SimpleDateFormatロケールを使用するため、コンピュータはおそらくデフォルトでデンマーク語を使用するように設定されています。英語ロケールを明示的に指定します。

DateFormat formatter = new SimpleDateFormat("MMM", Locale.ENGLISH);
于 2011-03-16T14:34:48.270 に答える