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

2022-09-03 05:33:22

我在 Windows 7 计算机上运行我的 Java 应用,其中我的区域设置设置为将日期格式化为 YYYY-mm-dd,将时间设置为 HH:mm:ss(例如“2011-06-20 07:50:28”)。但是当我使用格式化我的日期时,我没有看到相反,我得到“20-Jun-2011 7:50:28 AM”。我需要执行哪些操作才能按照客户设置操作系统以显示日期的方式设置日期的格式?DateFormat.getDateTimeInstance().format

以下是我有问题的代码:

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));
}

这些调用用于将日期放入如下所示的句子中:Messages.getFormattedStringMessageFormat

播放回合 'QB Nat vs Ian 008' (收到 20-Jun-2011 7:50:28 AM)

但是,我的操作系统设置设置为格式化日期,如上所述,我希望看到以下内容:

播放回合 'QB Nat vs Ian 008' (收到 2011-06-20 07:50:28)

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


答案 1

首先,你必须告诉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  

答案 2

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

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

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

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

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

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;
    }