24

私はフランス語のロケールで日付を表す文字列を持っています: 09-oct-08:

その String を解析する必要があるため、次の SimpleDateFormat を思い付きました。

String format2 = "dd-MMM-yy";

しかし、月の部分に問題があります。これは、末尾のドットで予想されるようです:

df2.format(new Date());

私に与えます:

 28-oct.-09

SimpleDateFormat ("09-oct-08") を理解させる最善の方法は何ですか?

完全なコード:

String format2 = "dd-MMM-yy"; 
DateFormat df2 = new SimpleDateFormat(format2,Locale.FRENCH); 
date = df2.parse("09-oct-08"); 

これは私に与えます: java.text.ParseException: Unparseable date: "09-oct-08"

そして、ログに記録しようとすると:

df2.format(new Date()); 

2009 年 10 月 28 日

4

6 に答える 6

7

これはうまくいくようです:

    DateFormatSymbols dfsFr = new DateFormatSymbols(Locale.FRENCH);
    String[] oldMonths = dfsFr.getShortMonths();
    String[] newMonths = new String[oldMonths.length];
    for (int i = 0, len = oldMonths.length; i < len; ++ i) {
        String oldMonth = oldMonths[i];

        if (oldMonth.endsWith(".")) {
            newMonths[i] = oldMonth.substring(0, oldMonths[i].length() - 1);
        } else {
            newMonths[i] = oldMonth;
        }
    }
    dfsFr.setShortMonths(newMonths);
    DateFormat dfFr = new SimpleDateFormat(
        "dd-MMM-yy", dfsFr);

    // English date parser for creating some test data.
    DateFormat dfEn = new SimpleDateFormat(
        "dd-MMM-yy", Locale.ENGLISH);
    System.out.println(dfFr.format(dfEn.parse("10-Oct-09")));
    System.out.println(dfFr.format(dfEn.parse("10-May-09")));
    System.out.println(dfFr.format(dfEn.parse("10-Feb-09")));

編集:セントシャドーが私を打ち負かしたようです。

于 2009-10-28T09:01:58.607 に答える
3

「.」を削除するだけです。

df2.format(new Date()).replaceAll("\\.", ""));

編集、レモンの答えに関して:

ロケール フランス語を使用する場合のフォーマットに問題があるようです。.したがって、私が説明したように、単純に削除を使用することをお勧めします。

実際、次のコード:

    String format2 = "dd-MMM-yy";
    Date date = Calendar.getInstance().getTime();
    SimpleDateFormat sdf = new SimpleDateFormat(format2, Locale.FRENCH);
    System.out.println(sdf.format(date));
    sdf = new SimpleDateFormat(format2, Locale.ENGLISH);
    System.out.println(sdf.format(date));

次の出力が表示されます。

28-oct.-09
28-Oct-09

再編集

わかりました、私は今あなたの問題を手に入れました。

最初に文字列を処理せずにこの問題を解決する方法がよくわかりません。アイデアは、元の文字列の月を包括的な月に置き換えることです:

        String[] givenMonths = { "jan", "fév", "mars", "avr.", "mai", "juin", "juil", "août", "sept", "oct", "nov", "déc" };
        String[] realMonths = { "janv.", "févr.", "mars", "avr.", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc." };
        String original = "09-oct-08";
        for (int i = 0; i < givenMonths.length; i++) {
            original = original.replaceAll(givenMonths[i], realMonths[i]);
        }
        String format2 = "dd-MMM-yy";
        DateFormat df2 = new SimpleDateFormat(format2, Locale.FRENCH);
        Date date = df2.parse(original);
        System.out.println("--> " + date);

SimpleDateFormat私は同意します、これはひどいですが、Dateクラスを使用する場合、他の解決策はありません。

別の解決策は、 Joda Timeなどの元の JDK ライブラリの代わりに、実際の日付と時刻のライブラリを使用することです。

于 2009-10-28T07:47:30.010 に答える
2
String format2 = "dd-MMM-yy";
Date date = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat(format2);
System.out.println(sdf.format(date));

出力28-Oct-09

ドットが見えません。印刷物を再確認してみましたか?たぶん、あなたは誤っ.てあなたの横に を置きましたMMMか?


デフォルトのロケール(米国だと思います)を使用するか、あなたjava.text.ParseException: Unparseable date: "09-oct-08"の横に"09-oct-08"Locale.FRENCH.oct

于 2009-10-28T07:47:32.723 に答える
2

では、«ブルート フォース» を試してみてください :)

DateFormatSymbols dfs = new DateFormatSymbols(Locale.FRENCH);
String[] months = new String[13]
<fill with correct month names or just replace these month, that are not fully correct>
dfs.setMonths(months);
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yy", dfs);
Date nweDate = sdf.parse("09-fév-08");
于 2009-10-28T08:16:40.637 に答える
1

私は同じ問題(フランス語と余分なドット)を抱えていましたが、この問題を解決する正しい方法は、次のようにフランス語のロケールをグローバルに上書きすることだと思います:

import moment from 'moment';
moment.locale('fr', { monthsShort: 'janv_févr_mars_avr_mai_juin_juil_août_sept_oct_nov_déc'.split('_') });

元のmonthsShortフランス語オブジェクトには のようなドットが janv._févr._mars_avr._...あるため、それらを削除しています。

これは、上書きできるものを確認できるドキュメントへのリンクです。

ie.: を上書きするだけの場合は、完全なロケール オブジェクトを渡す必要がないことに注意してくださいmonthsShort

于 2016-02-22T22:31:16.987 に答える