2014-05-19 12 views
8

Ho bisogno di ottenere il nome del mese in base al suo numero in diversi Locales.Ottenere il nome del mese nominativo in jodaTime

Per fare questo ho creare un oggetto DateTime (o YearMonth, non importa) e ottenere la sua monthOfYear Proprietà:

YearMonth md = new YearMonth(1992, month); 
System.out.println(md.monthOfYear().getAsText(new Locale("ru"))); 

Il fatto è che funziona bene per la lingua inglese, perché i nomi nominativo e genitivo sono lo stesso, ma per altri linguaggi restituisce solo genitivo, che non è quello che mi serve.

Come ottenere il nome del mese nominale?

risposta

3

C'è stata una significativa (! Ritroso-compatibile) cambiamento nel modo in cui i nomi dei mesi sono localizzati in Java 7 e Java 8.

questo si riferisce per il nuovo java.time API (Tutorial) introdotta da Java 8. l'API (ragionevolmente) distingue due forme diverse di un nome del mese, come definito da java.time.format.TextStyleenum:

  • Standalone, che rappresenta il mo nesimo nome così com'è. Corrisponde al "nominativo" in molte lingue.
  • Standard, che viene in genere utilizzato all'interno di rappresentazioni di date complete. Questo corrisponde al "genitivo".

La variante di default per il formattatore di date è "standard", che sembra anche ragionevole, in quanto i formattatori vengono in genere utilizzati per produrre date complete. Sfortunatamente, questo ha portato a un cambiamento nel comportamento (almeno per alcune lingue) tra Java 7 (che ha usato per produrre nomi autonomi) e Java 8 (che produce un nome "standard").

È possibile richiedere esplicitamente il modulo standalone/nominativo utilizzando la suddetta enumerazione TextStyle. Sfortunatamente, questo rende il tuo codice dipendente da Java 8 o versioni successive.

demo rapida:

import java.time.Month; 
import java.time.format.TextStyle; 
import java.util.Locale; 

for (TextStyle ts : TextStyle.values()) { 
    System.out.print(ts + ": "); 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.ENGLISH) + "/"); // English 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("cs")) + "/"); // Czech 
    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("ru")) + "/"); // Russian 
    System.out.println(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("pl"))); // Polish 
} 

che stampa:

FULL: October/října/октября/października 
FULL_STANDALONE: 10/říjen/Октябрь/październik 
SHORT: Oct/Říj/окт/paź 
SHORT_STANDALONE: 10/X/Окт./paź 
NARROW: O/ř/О/p 
NARROW_STANDALONE: 10/ř/О/p 

non so di un modo semplice per ottenere la forma autonoma che avrebbe lavorato sia sotto Java 7 e Java 8. Al almeno non in Java puro - ovviamente, ci sono alcuni modi complicati e più fragili, come cercare di rilevare la versione di Java o l'utilizzo di una libreria di terze parti.

+1

Gran parte della funzionalità java.time è back-porting su Java 6 e 7 in [* ThreeTen-Backport *] (http://www.threeten.org/threetenbp/). Ulteriore adattamento per Android nel progetto [* ThreeTenABP *] (https://github.com/JakeWharton/ThreeTenABP). –

6

Penso che stai confondendo genitivo con nominativo. Quando eseguo il seguente codice:

import org.joda.time.YearMonth; 
import java.util.Locale; 

public class X { 

    public static void main(String[] s){ 
     for (int i = 1;i<13; i++) { 
      YearMonth md = new YearMonth(1992, i); 
      System.out.println(md.monthOfYear().getAsText(new Locale("ru"))); 
     } 
    } 
} 

ottengo il seguente risultato:

Январь 
Февраль 
Март 
Апрель 
Май 
Июнь 
Июль 
Август 
Сентябрь 
Октябрь 
Ноябрь 
Декабрь 

Che è, per mia conoscenza russo :) nominativo. Probabilmente hai bisogno di diventare genitivo, ma dubito che Joda lo sostenga. Sei libero di implementare da soli, si prega di consultare questa domanda: Month name in genitive (Polish locale) with Joda-Time DateTimeFormatter

+1

copio-incollato ed eseguire il codice e ottengo risultato Genitivo: января февраля марта апреля ... :) Qual è la vostra versione di jodatime? Il mio è 2.3 – troy

+0

Wow, è interessante ... Io uso il 2.4 ma non posso riprodurre questo cambiando la versione di Joda. Forse ha a che fare con: https://bugs.openjdk.java.net/browse/JDK-8054482 –

+0

Credo che questo dipenda dalla versione di Java. Cosa Java avete entrambi? – Marwin

Problemi correlati