【问题标题】:Android Parse Exception occurs sometimes [duplicate]有时会发生Android Parse Exception [重复]
【发布时间】:2020-08-30 23:12:37
【问题描述】:

您好,我有一个奇怪的问题。我正在从网络上获取一些按预期工作的 xml 数据。 当我调用从我的片段中获取数据的方法时,一切都很好,但是如果我在另一个片段中为相同的 url 调用完全相同的方法,它会抛出这个奇怪的解析异常,我试图将传入的日期字符串转换为以毫秒为单位的长时间戳。 如果错误在它不工作的片段中发生过一次,它也会在之前工作的片段中停止工作。 它抛出这个异常:

java.text.ParseException: Unparseable date: "Sun, 30 Aug 2020 00:32:42 +0000"

我用于简单日期格式的模式是

"EEE, dd MMM yyyy HH:mm:ss Z"

谁能告诉我为什么会这样,因为我使用的模式似乎有效,那么为什么我会得到这个异常?

【问题讨论】:

  • 相关问题并不真正适合我,那么为什么我与它相关联?这就是线程导致的 NumberFormatException 的全部内容,而这在我的应用程序中没有发生。
  • 正如我认为我的问题与为什么我的被标记为重复的问题无关!问题是我使用 Locale.getDefault() 作为 SimpleDateFormat 的第二个参数,而我试图解析的日期字符串被本地化为英文。因此,如果 Locale.getDefault() 中的本地不返回英语,它总是抛出此异常,因为本地返回的本地不知道英语本地化日期字符串(月份名称)。所以在我的情况下,答案只是将 Locale.ENGLISH 设置为 SimpleDateFormat 的第二个参数,因为我收到的日期总是翻译的。英文。
  • 感谢 Martin S 的反馈。如果您从一开始就在问题中发布了您的代码,我们将能够发现这是问题所在,并且可以立即为您提供正确的帮助。不过,您的观察似乎无法解释为什么它在一个片段中有效,而在另一个片段中无效。无论如何,我已更改链接以引用更合适的原始问题。
  • 我的错,为什么它在一个片段中起作用而在另一个片段中起作用的问题与我在测试时使用 android studio 部署我的应用程序的方式无关。我已选择应将应用程序部署为捆绑包中的 APK,因为我使用的是动态功能交付,并且奇怪的是,在启动另一个片段所在的新活动时,本地会从英语切换到德语。部署时不会发生这种情况应用程序到 PlayStore,仅在调试版本中,但正如我提到的,通过将 Local 始终设置为英语而不使用 Locale.getDefault() 来修复它。下次我会更精确。
  • 是的,新的正是我正在寻找的,但我认为由于问题的标题,我无法找到它。再次感谢

标签: android date datetime simpledateformat


【解决方案1】:

我建议您从过时且容易出错的 java.util 日期时间 API 和 SimpleDateFormat 切换到 modern java.time 日期时间 API 和相应的格式化 API(包,java.time.format)。从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。

如果您的 Android API 级别仍然不兼容 Java8,请检查 How to use ThreeTenABP in Android ProjectJava 8+ APIs available through desugaring

使用 Java 现代日期时间 API 执行以下操作:

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Given date-time string
        String dateTimeString = "Sun, 30 Aug 2020 00:32:42 +0000";

        // Parse the given date-time string into OffsetDateTime as it has a Zone Offset
        // of +0000 hours
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeString, DateTimeFormatter.RFC_1123_DATE_TIME);

        // Display OffsetDateTime in the default format
        System.out.println(odt);

        // Display OffsetDateTime in some custom formats
        System.out.println(odt.format(DateTimeFormatter.RFC_1123_DATE_TIME));
        System.out.println(odt.format(DateTimeFormatter.ofPattern("u-MM-dd HH:mm:ss X")));
    }
}

输出:

2020-08-30T00:32:42Z
Sun, 30 Aug 2020 00:32:42 GMT
2020-08-30 00:32:42 Z

【讨论】:

  • 我的最低 API 是 23,我不想仅仅为此添加第三方依赖,因为它看起来效率很低。
  • 马丁,你考虑过desugaring吗?并不是说 ThreeTenABP 效率低下。
猜你喜欢
  • 1970-01-01
  • 2012-07-10
  • 2019-03-26
  • 2017-07-26
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2015-09-01
相关资源
最近更新 更多