当前位置: 首页 > 面试题库 >

Android棉花糖中的SimpleDateFormat行为更改

能钟展
2023-03-14
问题内容

我在Android
6.0(棉花糖)上遇到了日期格式问题。引发以下异常的代码是我的应用程序用于API请求(“客户端”)的纯Java库(单独构建)。如果相关的话,该库是用Java
1.6构建的……无论如何,这是代码。

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK);
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 23).trim());

record具有价值;

2015-10-23 Fri 10:59 PM BST   3.60 meters

…“修剪”之后是;

2015-10-23 Fri 10:59 PM
yyyy-MM-dd E hh:mm aa

该代码自Froyo成立以来一直有效,并且已经过单元测试。除了棉花糖,所有东西都会抛出异常。

10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: SynchroniseTidePosition.doInBackground
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: java.text.ParseException: Unparseable date: "2015-10-23 Fri 10:59 PM" (at offset 21)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.text.DateFormat.parse(DateFormat.java:579)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.oceanlife.rover.handler.XTideParser.parseResponse(XTideParser.java:69)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:107)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:43)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:     at java.lang.Thread.run(Thread.java:818)

偏移量“ 21”是10:59中“ 9”之后的空格。谁能解释这个失败?

更新资料

切换到joda-time,它会显示更多信息的错误消息。这里是;

Invalid format ... is malformed at "PM"

…所以,这是关于要解析的字符串的AM / PM方面-
回到文档


问题答案:

在英国语言环境中,“ am”和“ pm”的定义似乎已更改。

在棉花糖中,英国区域设置现在将“ am”表示为“ am”,将“ pm”表示为“ pm”

String record = "2015-10-23 Fri 10:59 p.m. BST   3.60 meters"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK);

// note the length is 25 now, not 23... 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 25).trim());

我无法解释为什么,但是美国语言环境与am / pm合作,英国与am / pm合作

编辑

似乎在2015年3月的en_gb语言环境更新中,该语言环境已替换其am /
pm定义。源差异



 类似资料:
  • 问题内容: 我正在创建一个可产生现场乐器声音的应用程序,并且计划使用Android棉花糖(6.0版)中的新Midi API。我已经在http://developer.android.com/reference/android/media/midi/package- summary.html上 阅读了软件包概述文档,并且我知道如何生成Midi笔记,但是我仍然不确定:我该怎么办在生成它们的Midi数据

  • IntelliJ Android Studio上次更新(2016年1月30日起)支持Java8吗? 我用了一个lambda表达式 注意:我使用的是最后一个API级别

  • 当我运行app时,它在logcat中显示这个 java.lang.SecurityException:权限拒绝:从ProcessRecord{2dd511f 24656:com.marg.pharmanxt/u0a158}(PID=24656,UID=10158)中启动意图{act=android.Intent.action.call dat=tel:xxxxxxxxxcapt=2dd511f 2

  • 问题内容: 我有一个图像URI,我想将此URI转换为真实路径。我看了很多答案,但没有一个对我有用。我正在使用棉花糖6.0.1。图片URI为。 码: 问题答案: A 不是。A 不必代表您可以访问的文件系统上的文件。将可能指向的内容是: 存储在无法访问的可移动存储中 存储在另一个应用程序的内部存储中,您无法访问 以加密形式存储,需要解密时 存储在SQLite数据库的BLOB列中,需要将其加载并提供服务

  • 问题内容: 自三星S7推出以来,缺少一些短信,它们从未显示在content:// sms提供程序URI中。我注意到在同一运营商(在本例中为T- Mobile)上的多个Samsung设备(S6和/或S7)之间存在此问题,但可能不限于此。这些文本消息显示在默认的股票消息收发应用程序中,但是我找不到如何访问它们。请记住,通过该内容提供商我可以收到97%的短信,但最后3%使我难以理解。 我还查看了SIM卡

  • 问题内容: 我已经成功使用javax.crypto.Cipher.getInstance(“ DESede / CBC / NoPadding”)在Android上通过DESFire卡进行身份验证 。它可以在Android 4到5的多种设备上运行,但是在我更新为6棉花糖(和6.0.1)的Nexus 7上停止了工作。在更新之前,它一直在同一设备上工作。 似乎Cipher的工作方式不同,对于相同的密钥