سؤال

لدي سلسلة تمثل تاريخ في الفرنسية الإعدادات المحلية :09-oct-08 :

أريد أن تحليل هذه السلسلة لذا خطرت لي هذه 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.النص.ParseException:Unparseable التاريخ:"09-oct-08"

وإذا كنت ثم محاولة تسجيل الدخول :

df2.format(new Date()); 

أحصل على :28-oct.-09

هل كانت مفيدة؟

المحلول

يبدو أن هذا العمل:

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

تحرير:يشبه القديسظل يضربني.

نصائح أخرى

يمكنك ببساطة إزالة ".":

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 فصول.

حل آخر هو استخدام الحقيقي التاريخ والوقت المكتبة بدلا من الأصلي JDK منها ، مثل Joda الوقت.

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

موافق, ثم حاول "القوة الغاشمة" :)

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

java.الوقت

دعونا نرى ما اذا كان java.الوقت الإطار يمكن أن تساعد.

حول جافا.الوقت

على java.الوقت إطار صلب جافا 8 وما بعدها supplants مزعجة القديمة جافا.util.التاريخ/.التقويم الطبقات.فئات جديدة مستوحاة من ناجحة للغاية Joda الوقت الإطار يقصد به خليفة مماثلة في مفهوم ولكن إعادة هندستها.تعريف JSR 310.تمديد من قبل ThreeTen إضافية المشروع.ترى البرنامج التعليمي.

LocalDate

على عكس القديم دروس جافا.الوقت تقدم LocalDate فئة تمثل التاريخ قيمة ، مع أي وقت من اليوم أو المنطقة الزمنية.

الاختصارات الفرنسية

نلقي نظرة على ما formatters في جاوة.الوقت أتوقع يختصر أشهر الأسماء في en Français.

يمكننا حلقة Month التعداد للحصول على قائمة أشهر.هذا التعداد تقدم getDisplayName طريقة لتوليد اسم مترجم من الشهر الجاري.هذا الرمز يدل على أن الطريقة تنتج الإخراج نفس جافا.الوقت المنسق.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "dd-MMM-yyyy" ).withLocale ( Locale.FRENCH );
for ( Month month : Month.values () ) {
    LocalDate localDate = LocalDate.of ( 2015 , month.getValue () , 1 );
    String output = formatter.format ( localDate );
    String displayName = month.getDisplayName ( TextStyle.SHORT , Locale.FRENCH );
    System.out.println ( "output: " + output + " | displayName: " + displayName );// System.out.println ( "input: " + input + " → " + localDate + " → " + output );
}
output: 01-janv.-2015 | displayName: janv.
output: 01-févr.-2015 | displayName: févr.
output: 01-mars-2015 | displayName: mars
output: 01-avr.-2015 | displayName: avr.
output: 01-mai-2015 | displayName: mai
output: 01-juin-2015 | displayName: juin
output: 01-juil.-2015 | displayName: juil.
output: 01-août-2015 | displayName: août
output: 01-sept.-2015 | displayName: sept.
output: 01-oct.-2015 | displayName: oct.
output: 01-nov.-2015 | displayName: nov.
output: 01-déc.-2015 | displayName: déc.

نجد مزيج من 3 و 4 حرف هجاء.أطول أسماء مختصرة إلى أربعة أحرف بالإضافة إلى فترة (ووقف كامل).أربعة أشهر أسماء قصيرة بما يكفي لاستخدامها دون اختصار: mars, mai, juin, août.

لذلك ، كما نوقش في إجابات أخرى, لا توجد حلول بسيطة.

إصلاح مصدر البيانات

اقتراحي الأول هو إصلاح مصدر البيانات.هذا المصدر على ما يبدو فشل في متابعة السليم الفرنسية قواعد الاختصار. يال ويتفق مع جافا 8 فهم الفرنسية.بالمناسبة, إذا كان تحديد مصدر البيانات أقترح بشدة باستخدام أربعة أرقام سنة اثنين تؤدي إلى ما لا نهاية من الارتباك والغموض.

إصلاح الإدخال

بالطبع قد يكون المصدر من السيطرة/النفوذ.في هذه الحالة, كما هو الحال مع إجابات أخرى, قد تحتاج إلى القيام القوة الغاشمة استبدال بدلا من أن يحاول أي ذكاء.من ناحية أخرى, إذا كانت المشكلة فقط مع المدخلات الخاصة بك هو ببساطة المفقودين الفترة (وقف كامل), ثم هل يمكن أن الناعمة التعليمات البرمجية باستخدام Month التعداد بدلا من الصعب رمز غير لائق القيم.

وأود أن جعل أولي تحليل المحاولة.الفخ DateTimeParseException, قبل محاولة إصلاح.إذا طرح استثناء ، ثم إصلاح الإدخال.

لإصلاح الإدخال ، حاول كل شهر من شهور السنة من خلال حلقات ممكن مجموعة من التعداد الحالات.عن كل شهر ، على اسم مختصر.قطاع الفترة (وقف كامل) من هذا الاختصار ، لتتناسب مع ما المشتبه به هو غير لائق واردة القيمة.اختبار لمعرفة ما إذا كان هذا هو في الواقع يطابق الإدخال.إذا لم تذهب إلى الشهر المقبل.

عندما نحصل على المباراة ، وتحديد المدخلات بشكل صحيح مختصر اللغة هي القواعد (قواعد فرنسية في حالتنا).ثم تحليل المدخلات ثابتة.هذا من شأنه أن يكون لدينا الثاني تحليل المحاولة ، كما قدمنا محاولة أولية في الأعلى.إذا فشلت المحاولة الثانية, هناك شيء خاطئ جدا كما لوحظ في FIXME: ينظر هنا.ولكن عادة هذا الثاني تحليل محاولة لن تنجح, و نحن يمكن أن ننقذ من for حلقة من Month enum.

وأخيرا, هل يمكن أن تحقق النجاح من خلال اختبار إذا كانت النتيجة لا تزال وهمية العلم القيمة مجموعة في البداية (LocalDate.MIN).

String input = "09-oct-08"; // Last two digits are Year.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "dd-MMM-yy" ).withLocale ( Locale.FRENCH );
LocalDate localDate = LocalDate.MIN; // Some folks prefer a bogus default value as a success/failure flag rather than using a NULL.
try {
    localDate = LocalDate.parse ( input , formatter );
} catch ( DateTimeParseException e ) {
    // Look for any month name abbreviation improperly missing the period (FULL STOP).
    for ( Month month : Month.values () ) {
        String abbreviation = month.getDisplayName ( TextStyle.SHORT , Locale.FRENCH );
        String abbreviationWithoutFullStop = abbreviation.replace ( "." , "" ); // Get short abbreviation, but drop any period (FULL STOP).
        String proper = "-" + abbreviation + "-";
        String improper = "-" + abbreviationWithoutFullStop + "-";
        if ( input.contains ( improper ) ) {
            String inputFixed = input.replace ( improper , proper );
            try {
                localDate = LocalDate.parse ( inputFixed , formatter );
            } catch ( DateTimeParseException e2 ) {
                // FIXME: Handle this error. We expected this second parse attempt to succeed.
            }
            break; // Bail-out of the loop as we got a hit, matching input with a particular improper value.
        }
    }
}
Boolean success =  ! ( localDate.equals ( LocalDate.MIN ) );
String formatted = formatter.format ( localDate );;
String outputImproper = formatted.replace ( "." , "" );  // Drop any period (FULL STOP).

تفريغ وحدة التحكم.

System.out.println ( "success: " + success + ". input: " + input + " → localDate: " + localDate + " → formatted: " + formatted + " → outputImproper: " + outputImproper );

النجاح:صحيح.الإدخال:09-oct-08 → localDate:2008-10-09 → تنسيق:09-oct.-08 → outputImproper:09-oct-08

كنت أعاني من نفس المشكلة (الفرنسية إضافية النقاط) وأعتقد الطريق الصحيح لحل هذه المشكلة من خلال عالميا الكتابة اللغة الفرنسية مثل ذلك:

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._..., لذا نحن فقط إزالتها.

هنا رابط مستندات حيث يمكنك الاختيار ما يمكن تجاوزها.

ملاحظة أننا لا تحتاج إلى تمرير كامل الإعدادات المحلية الكائن إذا كنا نريد فقط إلى الكتابة فوق أي.: monthsShort.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top