在jodaTime获得主要月份名称

tro*_*roy 8 java jodatime

我需要根据它的号码得到月份名称Locales.

要做到这一点,我创建一个DateTime(或YearMonth无关紧要)对象并获取其monthOfYear属性:

YearMonth md = new YearMonth(1992, month);
System.out.println(md.monthOfYear().getAsText(new Locale("ru")));
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ski 5

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

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")));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

??????
???????
????
??????
???
???? 
????
??????
????????
???????
??????
???????
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*win 4

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

\n\n

这与 Java 8 引入的新java.time API(教程)有关。该 API(相当合理)区分了月份名称的两种不同形式,如enum所定义:java.time.format.TextStyle

\n\n
    \n
  • Standalone,按原样表示月份名称。它对应于许多语言中的“主格”。
  • \n
  • Standard,通常在完整日期表示中使用。这对应于“所有格”。
  • \n
\n\n

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

\n\n

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

\n\n

快速演示:

\n\n
import java.time.Month;\nimport java.time.format.TextStyle;\nimport java.util.Locale;\n\nfor (TextStyle ts : TextStyle.values()) {\n    System.out.print(ts + ":  ");\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.ENGLISH ) + " / ");  // English\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("cs")) + " / ");  // Czech\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("ru")) + " / ");  // Russian\n    System.out.println(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("pl")));  // Polish\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

哪个打印:

\n\n
import java.time.Month;\nimport java.time.format.TextStyle;\nimport java.util.Locale;\n\nfor (TextStyle ts : TextStyle.values()) {\n    System.out.print(ts + ":  ");\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.ENGLISH ) + " / ");  // English\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("cs")) + " / ");  // Czech\n    System.out.print(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("ru")) + " / ");  // Russian\n    System.out.println(Month.OCTOBER.getDisplayName(ts, Locale.forLanguageTag("pl")));  // Polish\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n