在jodaTime获得主要月份名称

时间:2014-05-19 13:57:04

标签: java jodatime

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

为此,我创建了一个DateTime(或YearMonth,无关紧要)对象并获取其monthOfYear属性:

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

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

如何获得有名的月份名称?

2 个答案:

答案 0 :(得分:6)

我认为你将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支持它。您可以自由实施,请参阅此问题:Month name in genitive (Polish locale) with Joda-Time DateTimeFormatter

答案 1 :(得分:3)

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

这与Java 8引入的新java.time API(Tutorial)有关.API(非常合理地)区分两个不同形式的月份名称,由java.time.format.TextStyle {定义{3}}:

  • 独立,代表月份名称。它对应于&#34;主格&#34;用多种语言。
  • 标准,通常在完整日期表示中使用。这对应于&#34; genitive&#34;。

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

通过使用上述TextStyle枚举,可以明确地要求独立/提名形式。不幸的是,这会使您的代码依赖于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版本或使用某些第三方库。