2014-06-22 14 views
11

Mam to.Uzyskaj numer miesiąca od nazwy miesiąca

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String monthName = br.readLine(); 

Jak uzyskać numer miesiąca, który zawiera zmienną monthName? Dzięki!

+1

tokenize to. użyj podziału. czy możesz dodać więcej informacji? –

+0

Czy masz na myśli to, że jedynym tokenem na linii jest nazwa miesiąca? W takim przypadku powinieneś po prostu użyć przepływu sterowania przełącznikiem/sprawą (jeśli masz 1.7+), przy czym nazwy spraw to nazwy, a zwroty to miesiące. Jeśli nie, zrób to, co powiedział @KickButtowski, a następnie wykonaj to –

+1

Czy próbujesz przeanalizować nazwę numeru lub miesiąca? Czy możesz dać przykład? –

Odpowiedz

20

Użyj klasy Java Calendar. Może analizować dowolny łańcuch w prawidłowej instancji kalendarza. Oto przykład (zakładając, że miesiąc jest w języku angielskim).

Date date = new SimpleDateFormat("MMMM").parse(monthName); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
println(cal.get(Calendar.MONTH)); 

Możesz określić język w SimpleDateFormat:

String monthName = "März"; // German for march 
Date date = new SimpleDateFormat("MMMM", Locale.GERMAN).parse(monthName); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
println(cal.get(Calendar.MONTH)); 

Domyślnie Java używa lokalnego użytkownika do analizowania ciąg.

Należy pamiętać, że komputer zaczyna liczyć od 0. Więc, styczeń będzie 0. Jeśli chcesz ludzką data czytelny należy sformatować instancję kalendarza:

SimpleDateFormat inputFormat = new SimpleDateFormat("MMMM"); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(inputFormat.parse(monthName)); 
SimpleDateFormat outputFormat = new SimpleDateFormat("MM"); // 01-12 
println(outputFormat.format(cal.getTime())); 
+3

[przestarzałe] (http://docs.oracle.com/javase/8/docs/api/java/util/Date.html # getMonth--) javadocs stwierdza co używać zamiast tego – A4L

+0

Cóż, działa dobrze w Javie 6, ale zaktualizuję odpowiedź na Java 8+. – Matt3o12

+1

* Przestarzałe. ** Od wersji JDK 1.1 **, zastąpiony przez Calendar.get (Calendar.MONTH). * Jest tam przechowywany tylko ze względu na kompatybilność wsteczną i może zostać usunięty w przyszłej wersji! – A4L

2

Innym podejściem jest to za pomocą java.text.DateFormatSymbols :

public static int monthAsNumber(
    String month, 
    Locale locale, 
    boolean abbreviated, 
    boolean caseInsensitive 
) { 
    DateFormatSymbols dfs = new DateFormatSymbols(locale); 
    String[] months = (abbreviated ? dfs.getShortMonths() : dfs.getMonths()); 

    if (caseInsensitive) { 
    for (int i = 0; i < 12; i++) { 
     if (months[i].equalsIgnoreCase(month)) { 
     return i; // month index is zero-based as usual in old JDK pre 8! 
     } 
    } 
    } else { 
    for (int i = 0; i < 12; i++) { 
     if (months[i].equals(month)) { 
     return i; // month index is zero-based as usual in old JDK pre 8! 
     } 
    } 
    } 
    return -1; // no match 
} 

Proponowany podpis metody seach ilustruje wiele możliwych odmian. Przykład:

System.out.println(monthAsNumber("MÄRZ", Locale.GERMANY, false, true)); 
// output: 2 (zero-based!) 

Jeśli chcesz kilka miesięcy zaczynając od 1 a potem po prostu dodać 1 do wyniku (bardziej intuicyjny, a także moje zalecenie).

Począwszy od Java 8 masz również nową odmianę, a mianowicie samodzielne miesiące. Podczas gdy w języku angielskim nazwy tych miesięcy są identyczne w innych językach, nie zawsze są identyczne (na przykład w języku czeskim " leden " (styczeń) zamiast " ledna "). Aby osiągnąć te stand-alone formularze można użyć Month.getDisplayName(...) (nie testowane):

public static int monthAsNumber(
    String month, 
    Locale locale, 
    boolean abbreviated, 
    boolean caseInsensitive, 
    boolean standAlone 
) { 
    TextStyle style; 
    Month[] months = Month.values[]; 

    if (abbreviated) { 
    style = standAlone ? TextStyle.SHORT_STANDALONE : TextStyle.SHORT; 
    } else { 
    style = standAlone ? TextStyle.FULL_STANDALONE : TextStyle.FULL; 
    } 

    if (caseInsensitive) { 
    for (int i = 0; i < 12; i++) { 
     if (months[i].getDisplayName(style, locale).equalsIgnoreCase(month)) { 
     return i; // month index is zero-based as usual in old JDK pre 8! 
     } 
    } 
    } else { 
    for (int i = 0; i < 12; i++) { 
     if (months[i].getDisplayName(style, locale).equals(month)) { 
     return i; // month index is zero-based as usual in old JDK pre 8! 
     } 
    } 
    } 
    return -1; // no match 
} 
+0

Komentarz dotyczący "indeksu bazuje na wartości zero" skłania mnie do przypominania ludziom, że ['Month'] (http: // docs. oracle.com/javase/8/docs/api/java/time/Month.html) enum może być użyty w twoim kodzie zamiast wartości 'int'. Zamiast przechodzić wokół "10" lub "9" opartych na zerach na październik, przechodź wokół 'Month.OCTOBER', rzeczywistego obiektu bezpiecznego typu, a nie" magicznej liczby ". Zmodyfikuj przykładowy kod, zastępując 'return i;' opcją 'return months [i];'. 'Enum' jest dość funkcją uśpienia w Javie, niesamowicie użyteczną, gdy ją zrozumiesz. Zobacz [Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+0

@BasilBourque Dobrze, napisałem swój wkład w ten sposób, ponieważ OP wyraźnie chciał numeru, który daje przestrzeń do interpretacji, ale ja wolę enum jako typ zwrotu jak ty. Jedyną "wadą" dla OP może być to, że będzie on zmuszony do ponownego napisania swojego zgłoszenia z powodu niezgodnej zmiany podpisu metody, ale na koniec taki refaktoryzacja byłaby zwycięstwem dla PO. –

1

Jeśli masz nazwę miesiąca i chcesz liczbę całkowitą odpowiadającą danym miesiącu spróbować tej

try{ 
     Date date = new SimpleDateFormat("MMM").parse(monthName);//put your month name here 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(date); 
     monthNumber=cal.get(Calendar.MONTH); 
     System.out.println(monthNumber); 

} 
catch(Exception e) 
{ 
e.printStackTrace(); 
} 
3

rozwiązanie w Javie 8 dla angielskich nazw miesięcy.

private int getMonthNumber(String monthName) { 
    return Month.valueOf(monthName.toUpperCase()).getValue(); 
} 
Powiązane problemy