即使要检查的格式和字符串值相同,我总是得到解析异常.
这是代码:
String format = "EEE MMM dd HH:mm:ss z yyyy";String value = "Mon Sep 18 10:30:06 MST 2017";public static boolean isValIDFormat(String format, String value) { Date date = null; try { SimpleDateFormat sdf = new SimpleDateFormat(format); date = sdf.parse(value); // here it breaks if (!value.equals(sdf.format(date))) { date = null; } } catch (ParseException ex) { ex.printstacktrace(); //java.text.ParseException: Unparseable date: "Mon Sep 18 10:30:06 MST 2017" (at offset 0) } return date != null;}
解决方法:
它表示你的日期 – 时间字符串在索引0处是不可解析的.索引0是它所说的Mon,所以三个字母的时区缩写不是第一个嫌疑人.区域设置是. “Mon”是英语周一的缩写,但不是很多其他语言的缩写.因此,如果您的设备具有非英语语言设置 – 可能最近甚至已更改 – 这将完全解释您的观察结果.
短视的解决方案是
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.ROOT);
我使用Locale.ROOT来表示不应该进行特定于语言的处理.如果你的字符串是英文的,因为英语通常是全球计算中使用的语言,我认为这个选择是合适的.另一方面,如果它是英语,因为它来自英语区域,那么该区域设置将是正确的使用区域.
通过此更改,在我的计算机上,您的代码将您的日期格式化为2017年9月18日11:30:06 MDT 2017,正如您所看到的,它与我们开始的值不同,因此您的方法返回false.我的JVM将MST理解为山地标准时间,然后在9月假设夏令时(DST)并相应地格式化字符串.
ThreeTenABP
也就是说,Date和SimpleDateFormat是很久的过时类.您应该考虑摆脱它们并使用现代Java日期和时间API.在AndroID上你可以在ThreeTenABP中看到它,见this question: How to use ThreeTenABP in Android Project.现在你可以这样做:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format, Locale.ROOT); try { return zoneddatetime.parse(value, dtf).format(dtf).equals(value); } catch (DateTimeParseException dtpe) { dtpe.printstacktrace(); return false; }
这与上面的行为相同.
三个字母的时区缩写
您应该尽可能避免使用三个和四个字母的时区缩写.它们不是标准化的,通常含糊不清.例如,MST可能意味着马来西亚标准时间或山地标准时间.后者甚至不是一个全时区,因为MDT在一年中的大部分时间都在使用,这引起了我在上面所说的观察到的麻烦.
相反,看看你是否可以获得ISO 8601格式的字符串,如2017-09-18T10:30:06 08:00.第二好,只是得到一些明确的东西.一种方法是包括UTC的偏移而不是时区ID(或两者).
总结以上是内存溢出为你收集整理的android – 获取错误java.text.ParseException:Unparseable date :(在偏移0处)即使Simple日期格式和字符串值相同全部内容,希望文章能够帮你解决android – 获取错误java.text.ParseException:Unparseable date :(在偏移0处)即使Simple日期格式和字符串值相同所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)