我遇到了索尼Xperia LT26i日期上最奇怪的问题。日期格式:“hh:mm:ss a”将打印“01:00 pm”在大多数设备上,它打印“01:00 pm”。任何线索为什么会这样?由于我无法解析来自服务器的时间,因此我正在弄乱我的joda时间。
答案 0 :(得分:0)
JodaTime可以解析设备生成的本地am / pm-strings。如何处理来自服务器的不同字符串?因为幸运的是,你只希望服务器中的标记“am”或“pm”我建议使用两个专门的格式化程序对象,使用am / pm-literals进行解析。这就是解决方法:
static final DateTimeFormatter AM_PARSER = DateTimeFormat.forPattern("hh:mm:ss 'am'");
static final DateTimeFormatter PM_PARSER = DateTimeFormat.forPattern("hh:mm:ss 'pm'");
public static LocalTime parseServer(String input) {
if (input.endsWith("am")) {
return AM_PARSER.parseLocalTime(input);
} else {
LocalTime lt = PM_PARSER.parseLocalTime(input);
return lt.plusHours(12); // necessary because we parse pm only as literal
}
}
<强>解释强>
如果您研究JodaTime-source code,那么您会发现am / pm-strings最终来自DateFormatSymbols.getInstance(locale).getAmPmStrings()
。所以问题出现了为什么你有“p.m.”而不是索尼Xperia设备上的“pm”。这导致了类DateFormatSymbols
的数据源是什么的问题。这取决于在任何资源目录中管理此类数据的JVM提供程序(在您的情况下,取决于您的特殊Android配置,在我的情况下在资源包类sun.text.resources.FormatData
中)。每个JVM都有所不同(Android甚至不是官方的Java-VM)。
答案 1 :(得分:0)
在思考了一下后,我想出了这个解决方案
public static LocalTime localTimeParse(String date, DateTimeFormatter dateTimeFormatter) {
if(!StringUtils.hasText(date) || dateTimeFormatter == null)
return null;
LocalTime localTime = null;
try {
localTime = LocalTime.parse(date,dateTimeFormatter);
} catch(IllegalArgumentException exception) {
//This can happen on devices that have their time in the following format "01:00 p.m." insetad of "01:00 pm"
//Sony Xperia lT26i is one of them
String newDate = date.toLowerCase(Locale.getDefault()).contains("am") ? date.toLowerCase(Locale.getDefault()).replace("am", "a.m.") : date.toLowerCase(Locale.getDefault()).replace("pm", "p.m.");
localTime = LocalTime.parse(newDate,dateTimeFormatter);
}
return localTime;
}
可以这样使用:
DateTimeFormatter formatter = DateTimeFormat.forPattern("hh:mm a");
LocalTime localTime = DateUtils.localTimeParse("09:00 PM",formatter);
它适用于Xperia非Xperia