我需要根据不同Locales
中的号码来获取月份名称。
为此,我创建了一个DateTime
(或YearMonth
,无关紧要)对象并获取其monthOfYear
属性:
YearMonth md = new YearMonth(1992, month);
System.out.println(md.monthOfYear().getAsText(new Locale("ru")));
事情是适用于英语的,因为有名和基因名称是相同的,但对于其他语言,它只返回Genitive,这不是我需要的。
如何获得有名的月份名称?
答案 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;,这似乎也是合理的,因为格式化程序通常用于生成完整日期。不幸的是,这导致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版本或使用某些第三方库。