在jodaTime获得主要月份名称

我需要根据不同Locales的号码获取月份名称。

为此,我创建一个DateTime (或YearMonth ,无所谓)Object并获取其monthOfYear属性:

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

事情是适用于英语的,因为Nominative和Genitive名称是相同的,但对于其他语言,它只返回Genitive,这不是我需要的。

如何获得Nominative月名?

月份名称在Java 7和Java 8中的本地化方式发生了重大(向后不兼容!)的变化。

这与Java 8引入的新的java.time API( 教程 )有关.API (非常合理地)区分了两个不同forms的月份名称,由java.time.format.TextStyle 枚举定义:

  • 独立 ,代表月份名称。 它对应于许多语言中的“主格”。
  • 标准 ,通常在完整的日期表示中使用。 这对应于“属格”。

日期格式化程序的默认变体是“标准”,这似乎也是合理的,因为格式化程序通常用于生成完整日期。 不幸的是,这导致Java 7(用于生成独立名称)和Java 8(生成“标准”名称)之间的行为(至少对于某些语言)发生了变化。

通过使用上述TextStyle枚举,可以明确地要求独立/主格forms。 不幸的是,这会使您的代码依赖于Java 8或更高版本。

快速演示:

 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 } 

哪个印刷品:

 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 

我不知道有什么简单的方法可以获得可以在Java 7和Java 8下运行的独立表单。至少不是在纯Java中 – 当然,有一些复杂且更脆弱的方法,比如尝试检测Java版本或使用某些第三方库。

我认为你把genitive与主格混淆了。 当我运行以下代码时:

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

我得到以下结果:

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

这是为了我的俄罗斯知识:)主格。 你可能需要获得属性,但我怀疑Joda支持它。 你可以自己实现它,请看这个问题: 使用Joda-Time DateTimeFormatter的genitive(波兰语语言环境)中的月份名称