我应该根据我的应用中的语言显示不同的时间格式。当设备是英语时,用户应该获得如下的时间格式:
2018年3月18日,下午2时30分
但是当用户的设备是德语时,他应该得到这样的时间格式:
18.03.2018,14:30 Uhr
有没有办法通过使用String
格式化时间SimpleDateFormat
或者我应该以其他方式执行此操作,如果是这样,我怎么能这样做?
答案 0 :(得分:1)
我认为它不会起作用,但确实如此。只需将您喜欢的格式放入字符串xml文件中即可:
<string name="date_time_format">dd MMMM yyyy, hh.mm a</string>
<string name="date_time_format">dd.MM.yyyy, HH:mm</string>
然后在SDF中使用它:
SimpleDateFormat fmtOut = new SimpleDateFormat(context.getString(R.string.date_time_format), Locale.getDefault());
对于德语格式末尾的“Uhr”,我添加了一个占位符字符串,如下所示:
<string name="date_time_string">%s</string>
<string name="date_time_string">%s Uhr</string>
并使用String.format()方法返回格式化日期:
return String.format(context.getString(R.string.date_time_string), fmtOut.format(date));
答案 1 :(得分:0)
试试这段代码。希望它能解决这个问题。
java.sql.Date date1 = new java.sql.Date((new Date()).getTime());
SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
SimpleDateFormat formatNowYear = new SimpleDateFormat("yyyy");
SimpleDateFormat sdf12 = new SimpleDateFormat("hh:mm aa");
SimpleDateFormat sdf24 = new SimpleDateFormat("HH:mm");
SimpleDateFormat germanSdf = new SimpleDateFormat("dd.MM.yyyy");
String currentDay = formatNowDay.format(date1);
String currentYear = formatNowYear.format(date1);
String time12 = sdf12.format(date1);
String time24 = sdf24.format(date1);
String germanTime = germanSdf.format(date1);
Calendar mCalendar = Calendar.getInstance();
String currentMonth = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());
String engTime = currentDay+" "+currentMonth+" "+currentYear+", "+time12;
String germanFormat = germanTime+", "+time24+" Uhr";
答案 2 :(得分:0)
另一种方法是使用java.text.DateFormat
:
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.ENGLISH);
日期和时间样式(第一个和第二个参数)可以是SHORT
,MEDIUM
,LONG
或FULL
。如果需要,您可以使用Locale.getDefault()
获取设备的默认语言。
我不确定哪种风格组合可以提供你想要的东西 - 所有这些风格都给了我不同的输出,没有一个给我你描述的风格。
这是因为特定于语言环境的格式嵌入在JVM中,我不确定它在不同的API级别和设备之间是如何变化的。
如果上面的解决方案有效,那就没关系了。否则,另一种方法是在每个语言环境中制作特定的模式:
// get device's locale
Locale locale = Locale.getDefault();
String pattern = "";
// check language
if ("en".equals(locale.getLanguage())) {
// english
pattern = "dd MMMM yyyy, h.mm a";
} else if ("de".equals(locale.getLanguage())) {
// german
pattern = "dd.MM.yyyy, HH:mm 'Uhr'";
} else {
pattern = // use some default pattern for other languages?
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern, locale);
String formattedDate = sdf.format(new Date());
一个细节是,在我的JVM中,英语区域设置的AM / PM符号是大写的,因此您可能需要通过执行以下操作来调整它:
// change AM/PM to am/pm (only for English)
if ("en".equals(locale.getLanguage())) {
formattedDate = formattedDate.toLowerCase();
}
在API级别26中,您可以使用java.time API。对于较低级别,有一个nice backport,具有相同的类和功能。
这可以更好地使用。代码可能看起来很相似,但类本身解决了lots of internal issues of the old API。
您可以先尝试获取JVM的本地化模式,看看它们是否与您的输出相匹配:
Locale locale = Locale.getDefault();
FormatStyle style = FormatStyle.MEDIUM;
String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(style, style, IsoChronology.INSTANCE, locale);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, locale);
或者如上所述:
// get device's locale
Locale locale = Locale.getDefault();
String pattern = "";
// check language
if ("en".equals(locale.getLanguage())) {
// english
pattern = "dd MMMM yyyy, h.mm a";
} else if ("de".equals(locale.getLanguage())) {
// german
pattern = "dd.MM.yyyy, HH:mm 'Uhr'";
} else {
pattern = ""; // use some default pattern?
}
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, locale);
String formattedDate = LocalDateTime.now().format(fmt);
在我的测试中,我遇到了大写AM / PM英语的问题。您可以通过如上所述调用toLowerCase()
来解决此问题,但此API还允许您创建更灵活的格式化程序。
格式化程序是线程安全的(虽然SimpleDateFormat
不是),因此您可以根据语言创建格式化程序的静态映射,并根据需要重复使用它们:
// map of formatters
Map<String, DateTimeFormatter> formatterMap = new HashMap<>();
// English formatter
Map<Long, String> customAmPmSymbols = new HashMap<>();
customAmPmSymbols.put(0L, "am");
customAmPmSymbols.put(1L, "pm");
DateTimeFormatter f = new DateTimeFormatterBuilder()
// date/time
.appendPattern("dd MMMM yyyy, h.mm ")
// custom AM/PM symbols (lowercase)
.appendText(ChronoField.AMPM_OF_DAY, customAmPmSymbols)
// create formatter
.toFormatter(Locale.ENGLISH);
// add to map
formatterMap.put("en", f);
// German formatter
formatterMap.put("de", DateTimeFormatter.ofPattern("dd.MM.yyyy, HH:mm 'Uhr'", Locale.GERMAN));
// get device's locale
Locale locale = Locale.getDefault();
DateTimeFormatter fmt = formatterMap.get(locale.getLanguage());
if (fmt != null) {
String formattedDate = LocalDateTime.now().format(fmt);
}