12/24小时模式冲突
我是法国的Android开发人员,所以使用Locale.getDefault()
会导致我的DateFormat
使用24小时模式。但是,当我通过设置菜单手动将我的设备设置为12小时模式时,DateFormat
继续以24小时模式运行。
相反,TimePicker
是根据我自己的12/24小时设置设置的。
是否有方法使DateFormat
%s的行为方式与TimePicker
%s相同?
编辑:
这是我的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());
}
}
之后,无论您的设备设置为以24小时制还是12小时制显示时间,timeFormat
都将正确设置日期格式。TimePicker
也将正确设置。
解决方案
如果您在SimpleDateFormat
中指定了模式,则您已经固定了12/24小时模式,如果是模式符号"h"(1-12),则是12小时模式;如果是模式符号"H"(0-23),则是24小时模式。备选"k"和"k"相似,但范围略有不同。
也就是说,指定模式将使您的格式独立于设备设置!
另一种方法是使用DateFormat.getDateTimeInstance(),这会使时间样式依赖于系统区域设置(如果Locale.getDefault()
可能会发生变化,或者您必须部署一种机制来询问当前设备的区域设置,然后在Android-JavaLocale.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的使用(然后解析撇号以忽略替换方法中的这些部分)。
相关文章