如何在Java中设置尊重用户操作系统设置的日期和时间格式

Ian*_*lie 13 java windows formatting date

我在Windows 7机器上运行我的Java应用程序,我的区域设置设置为将日期格式设置为YYYY-mm-dd,时间格式为HH:mm:ss(例如"2011-06-20 07:50:28") .但是当我DateFormat.getDateTimeInstance().format用来格式化我的约会时,我没有看到相反,我得到的是"20-Jun-2011 7:50:28 AM".我需要做什么来设置日期,以便客户将其操作系统设置为显示日期?

这是我的代码看起来像:

File selGameLastTurnFile = selectedGame.getLastTurn ().getTurnFile ();
Date selGameModifiedDate = new Date (selGameLastTurnFile.lastModified());
if (selectedGame.isYourTurn ())  {
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.PlayTurn",  //$NON-NLS-1$
            FileHelper.getFileName (selGameLastTurnFile), 
            DateFormat.getDateTimeInstance().format(selGameModifiedDate));
}  else  {
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.SentTurn",  //$NON-NLS-1$
            selGameLastTurnFile.getName (), 
            DateFormat.getDateTimeInstance().format(selGameModifiedDate));
}
Run Code Online (Sandbox Code Playgroud)

Messages.getFormattedString呼叫使用MessageFormat把日期成句,这将是这样的:

转牌'QB Nat vs Ian 008'(收到20-Jun-2011 7:50:28 AM)

但是我的操作系统设置被设置为格式化日期,如上所述,我希望看到这个:

转牌'QB Nat vs Ian 008'(收到2011-06-20 07:50:28)

我在这里和其他Java编程站点搜索并找不到答案,但这似乎是一件显而易见的事情,我觉得我错过了一些明显的东西.

Fra*_*kie 8

首先,您必须告诉Java您的系统LOCALE是什么样的.

检查Java系统.
String locale = System.getProperty("user.language")

然后根据日期格式化日期(SimpleDateFormat)
SimpleDateFormat(String pattern, Locale locale)

有关工作示例,请参阅实用Java代码...

String systemLocale = System.getProperty("user.language");
String s;
Locale locale; 

locale = new Locale(systemLocale );
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// system locale is PT outputs 16/Jul/2011

locale = new Locale("us");
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// outputs Jul 16, 2011

locale = new Locale("fr");
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date());
System.out.println(s);
// outputs 16 juil. 2011  
Run Code Online (Sandbox Code Playgroud)


小智 6

Oracle JDK 8 完全支持使用用户自定义的操作系统区域设置进行格式化。

只需设置系统属性 java.locale.providers=HOST

根据https://docs.oracle.com/javase/8/docs/technotes/guides/intl/enhancements.8.html

HOST 代表当前用户对底层操作系统设置的自定义。它仅适用于用户的默认区域设置,可自定义设置可能因操作系统而异,但主要支持日期、时间、数字和货币格式。

这个格式化程序的实际实现在类中可用sun.util.locale.provider.HostLocaleProviderAdapterImpl。如果使用系统属性是不可接受的(例如,您不想影响整个应用程序),则可以直接使用该提供程序类。该类是内部 API,但可以使用反射访问:

private static DateFormat getSystemDateFormat() throws ReflectiveOperationException {
        Class<?> clazz = Class.forName("sun.util.locale.provider.HostLocaleProviderAdapterImpl");
        Method method = clazz.getMethod("getDateFormatProvider");
        DateFormatProvider dateFormatProvider = (DateFormatProvider)method.invoke(null);
        DateFormat dateFormat = dateFormatProvider.getDateInstance(DateFormat.MEDIUM, Locale.getDefault(Locale.Category.FORMAT));
        return dateFormat;
    }
Run Code Online (Sandbox Code Playgroud)


小智 4

您无法在纯 Java 中执行此操作。Sun/Oracle 不可能使这个系统独立。

快速浏览一下 .NET 库即可找到此页面- 引用:

用户可以选择通过控制面板的区域和语言选项部分覆盖与 Windows 当前区域性相关的一些值。例如,用户可能选择以不同的格式显示日期或使用区域性默认货币以外的货币。如果 CultureInfo.UseUserOverride 属性设置为 true,则还会从用户设置中检索 CultureInfo.DateTimeFormat 对象、CultureInfo.NumberFormat 对象和 CultureInfo.TextInfo 对象的属性。

如果您需要此功能,我建议您以系统依赖于 Windows 的方式执行此操作(例如,按照@laz 的建议访问 Windows 注册表)。