索尼Xperia发行日期

时间:2014-03-25 14:18:56

标签: android jodatime

我遇到了索尼Xperia LT26i日期上最奇怪的问题。日期格式:“hh:mm:ss a”将打印“01:00 pm”在大多数设备上,它打印“01:00 pm”。任何线索为什么会这样?由于我无法解析来自服务器的时间,因此我正在弄乱我的joda时间。

2 个答案:

答案 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