java.util.Calendar的非标准语言环境

我们在瑞典有一位客户,使用英文软件。 所以我们设置Locale(en, SV) 。 我们确实希望Calendar类符合国家/地区设置,但它使用语言,并且在此区域设置中它采用美国设置。

因此,我现在正在寻找一种方法,让日历通过标准方式了解新的firstDayOfWeekminimumDayinFirstWeek设置,而不是手动设置并因此硬编码。

澄清:2010年8月29日在瑞典的CW 34(也在德国和英国),但在美国,据报道为CW 36. 2010年1月1日是星期五和29.08的不同结果.2010一个星期天。

我无法将语言设置本身更改为瑞典语并使用英语后备,因为我们不支持瑞典语作为语言,但Sun / Oracle / ..确实如此,因此Swing UI将混合使用瑞典语和英语文本,这是不可接受的。

只是添加名为“sun.util.resources.CalendarData_en_SV.properties”的属性文件无法解决:它无法读取! 手动作为ResourceBundle是可能的。 不知何故,LocaleData.getCalendarData(Locale)在读取resourcfiles方面有自己的魔力,因为它的源不可用,所以我找不到它。 这里调用该方法: java.util.Calendar.setWeekCountData(Locale)

我还找到了java.util.spi包,但它不提供对firstDayOfWeek和minimumDaysInFirstWeek设置的访问。

也许我可以尝试拦截对resourcebundles的调用并使用默认的回退到英语,只允许对CalendarData的调用继续!? 但这听起来很糟糕。

 package de.drews.i18n; import java.util.Calendar; import java.util.Locale; import java.util.ResourceBundle; public class Test { /** * @param args */ public static void main(String[] args) { // en_GB = 34 // en_US = 36 // sv_SV = 34 // en_SV = 36 --> wrong printTest("en", "GB", 34); printTest("en", "US", 36); printTest("sv", "SV", 34); printTest("en", "SV", 34); } private static void printTest(String language, String country, int expected) { Locale locale = new Locale(language, country); Calendar cal = Calendar.getInstance(locale); cal.set(Calendar.YEAR, 2010); cal.set(Calendar.MONTH, Calendar.AUGUST); cal.set(Calendar.DATE, 29); int actual = cal.get(Calendar.WEEK_OF_YEAR); System.out.println(actual + "\t" + expected + "\t" + ((actual == expected) ? "Yeah!" : "-") + "\t" + language + "\t" + country); } } 

如何使用getInstance(TimeZone zone, Locale aLocale)提供时区来选择日历行为和语言环境来定义语言?

我可以提供的一个丑陋的解决方法是reflection性地获取Calendar类的cachedLocaleData静态字段,并将其放在以下位置:

 key = new Locale(..); // your english-swedish locale value = new int[] {firstDayOfWeek, minimalDaysInFirstWeek}; 

这可以在初始时完成,并适用于整个应用程序