2014-06-22 14 views
11

Ho questo.Ottieni il numero del mese dal nome del mese

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

Come ottenere il numero del mese che contiene nella variabile monthName? Grazie!

+1

tokenize it. usare split. puoi aggiungere ulteriori informazioni? –

+0

Vuoi dire che l'unico token sulla linea è il nome del mese? In questo caso dovresti semplicemente usare un flusso di controllo interruttore/caso (se hai 1.7+) con le dichiarazioni dei casi come nomi e il rendimento è di mesi. In caso contrario, fare ciò che @KickButtowski ha detto e fare quindi questo –

+1

Stai cercando di analizzare un numero o un nome di mese? Puoi fare un esempio? –

risposta

20

Utilizzare la classe Calendar di Java. Può analizzare una determinata stringa in un'istanza di calendario valida. Ecco un esempio (supponendo che il mese sia in inglese).

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

È possibile specificare la lingua in 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)); 

Per impostazione predefinita, Java utilizza l'utente del locale per analizzare la stringa.

Tenete a mente che un computer inizia a contare da 0. Quindi, Gennaio sarà 0. Se si desidera una data leggibile, è necessario formattare l'istanza di calendario:

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

[deprecato] (http://docs.oracle.com/javase/8/docs/api/java/util/Date.html # getMonth--) javadocs afferma cosa usare invece – A4L

+0

Bene, funziona bene in Java 6 ma aggiornerò la risposta per Java 8+. – Matt3o12

+1

* Obsoleto. ** A partire da JDK versione 1.1 **, sostituito da Calendar.get (Calendar.MONTH). * È conservato lì solo per compatibilità con le versioni precedenti e può essere rimosso in una versione futura! – A4L

2

Un altro approccio utilizza java.text.DateFormatSymbols è questo :

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 
} 

La firma proposto metodo seach illustra le molte possibili varianti. Esempio:

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

Se volete un numero di mese a partire con 1 poi basta aggiungere 1 al risultato (più intuitiva e anche la mia raccomandazione).

Partendo Java 8 si dispone di una nuova variante, anche, vale a dire stand-alone mesi. Mentre in inglese questi nomi dei mesi sono identici in altre lingue non sono sempre identici (ad esempio in lingua ceca " leden " (gennaio) anziché " ledna "). Per raggiungere questi autonomo forme è possibile utilizzare Month.getDisplayName(...) (non testato):

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

Il commento su "indice è a base zero" mi porta a ricordare alla gente che il ['mese'] (http: // docs. oracle.com/javase/8/docs/api/java/time/Month.html) enum può essere usato nel tuo codice invece dei valori di 'int'. Piuttosto che passare intorno a '10' o a zero' 9' per ottobre, passa intorno a 'Month.OCTOBER', un vero oggetto sicuro al posto piuttosto che" numero magico ". Modificare il codice di esempio sostituendo 'return i;' con 'return months [i];'. 'Enum' è piuttosto la funzione di sleeper in Java, incredibilmente utile una volta capito. Vedi il [Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html). –

+0

@BasilBourque Giusto, ho scritto il mio contributo in questo modo perché l'OP desiderava esplicitamente un numero che dia spazio all'interpretazione, ma preferisco un enum come tipo di ritorno come te. L'unico "svantaggio" per l'OP potrebbe essere che lui/lei sarà costretto a riscrivere la sua domanda a causa del cambiamento incompatibile della firma del metodo, ma alla fine un tale refactoring sarebbe una vittoria per l'OP. –

1

Se si dispone di nome del mese e si desidera numero intero corrispondente a quel mese provare questo

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

Soluzione in Java 8 per i nomi dei mesi inglesi.

private int getMonthNumber(String monthName) { 
    return Month.valueOf(monthName.toUpperCase()).getValue(); 
} 
Problemi correlati