12/24小时模式冲突

时间:2014-04-22 14:18:05

标签: android simpledateformat android-timepicker

我是法国Android开发人员,因此使用Locale.getDefault()会导致DateFormat使用24小时模式。但是,当我通过设置菜单手动将我的设备设置为12小时模式时,DateFormat将继续以24小时格式运行。

相反,TimePicker是根据我自己的12/24小时设置设置的。

有没有办法让DateFormat的行为与TimePicker相同?

修改

这是我的DateFormat声明:

timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());

这是我将TimePicker设置为12或24小时模式的地方。

tp.setIs24HourView(android.text.format.DateFormat.is24HourFormat((Context) this));

我的解决方案:

根据@Meno Hochschild的回答,以下是我解决这个棘手问题的方法:

boolean is24hour = android.text.format.DateFormat.is24HourFormat((Context) this);
tp.setIs24HourView(is24hour); // tp is the TimePicker
timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
if (timeFormat instanceof SimpleDateFormat) {
    String pattern = ((SimpleDateFormat) timeFormat).toPattern();
    if (is24hour) {
        timeFormat = new SimpleDateFormat(pattern.replace("h", "H").replace(" a",""), Locale.getDefault());
    }
    else {
        timeFormat = new SimpleDateFormat(pattern.replace("H", "h"), Locale.getDefault());
    }
}

在此之后,timeFormat将正确格式化日期,无论您的设备是以24小时格式还是以12小时格式显示时间。并且TimePicker也将被正确设置。

4 个答案:

答案 0 :(得分:4)

如果您在SimpleDateFormat中指定了模式,那么您已经修复了12/24小时模式,如果模式符号为“h”(1-12)或24小时,则为12小时模式 - 模式符号“H”(0-23)的情况下的模式。替代方案“k”和“K”类似,范围略有不同。

也就是说,指定一个模式会使您的格式与设备设置无关!

替代方法是使用DateFormat.getDateTimeInstance()使时间样式依赖于系统区域设置(如果Locale.getDefault()可能会更改 - 或者您必须部署一种机制,如何询问当前设备区域设置,然后再在Android-Java Locale.setDefault())中设置。

另一个特定于Android 的想法是使用字符串常量TIME_12_24直接询问系统设置,然后指定依赖于此设置的模式。这似乎也可以通过特殊方法DateFormat.is24HourFormat()来实现(请注意,Android有两个名为DateFormat的不同类。这种方法的具体例子:

boolean twentyFourHourStyle = 
  android.text.format.DateFormat.is24HourFormat((Context) this);
DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
if (df instanceof SimpleDateFormat) {
  String pattern = ((SimpleDateFormat) df).toPattern();
  if (twentyFourHourStyle) {
    df = new SimpleDateFormat(pattern.replace("h", "H"), Locale.getDefault());
  } else {
    df = new SimpleDateFormat(pattern.replace("H", "h"), Locale.getDefault());
  }
} else {
  // nothing to do or change
}

你当然可以自由地为可能出现的k和K细化代码,或者注意使用文字h和H(然后解析叛逆者在replace-method中忽略这些部分)。

答案 1 :(得分:1)

原始解决方案始终无法正常工作。我的解决方案更简单,更优雅:

Locale.US默认为12小时,然后我们设置为12小时。

我们检查用户是否已检查24小时格式,然后我们将Locale设置为默认24小时。

boolean twentyFourHourStyle = android.text.format.DateFormat.is24HourFormat(context);
DateFormat timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.US);
if (twentyFourHourStyle) {
    timeFormat = DateFormat.getTimeInstance(DateFormat.SHORT,Locale.FRANCE);
}

解决了3行;)

答案 2 :(得分:0)

确保使用正确的DateFormat类。

使用android.text.format.DateFormat.getTimeFormat(context);

当您在“设置”中更改“时间12/24”格式时,这会正确更新。

不要使用:java.text.DateFormat。这不起作用。

e.g。日期日期=新日期(); 字符串时间= android.text.format.DateFormat.getTimeFormat(context).format(date);

答案 3 :(得分:0)

我意识到这是一个老问题,但我在这里因为DateFormat.getTimeInstance(DateFormat.SHORT)对我来说也不起作用。使用API​​ 26(Android O)AVD很好,但它不适用于我的旧API 16和API 19设备(Android 4)。所以看起来问题只是旧代码的一个错误。我现在使用android.text.format.DateFormat.getTimeFormat()结合android.text.format.DateFormat.is24HourFormat()来获取正确的时间选择器。这适用于我的AVD和我的旧设备。