我有一些旧的 Java 代码尝试使用 来解析字符串SimpleDateFormat
。它经常抛出一个ParseException
:
非致命异常:java.text.ParseException:
无法解析日期:“06:00:00 PM”位于 java.text.DateFormat.parse(DateFormat.java:400)
我看不出这里出了什么问题。看起来很简单。希望有人能发现它。
public static String toTimeString(String time, String inTimeFormat, String outTimeFormat) {
DateFormat df1 = new SimpleDateFormat(inTimeFormat, Locale.getDefault());
DateFormat df2 = new SimpleDateFormat(outTimeFormat, Locale.getDefault());
String timeString = "";
try {
Date date = df1.parse(time); //<-- exception thrown here
_12HrTime = df2.format(date);
} catch (ParseException e) {
Crashlytics.recordException(e);
}
return timeString;
}
当它失败时,它被调用的方式如下:
toTimeString("06:00:00 PM", "hh:mm:ss a", "h:mm a")
请注意,该字符串06:00:00 PM
来自服务器响应。
每次我运行它时,它都能正常工作。但是 Crashlytics 经常报告此错误。我错过了什么?
您的服务器要么知道您的客户端的语言环境,要么不知道。
如果没有,并且
06:00:00 PM
无论设备的语言环境是波士顿、贝鲁特、布宜诺斯艾利斯还是布加勒斯特,它都返回一个值,那么Locale.getDefault()
可能不起作用。AM
和PM
是英语,默认语言环境应该翻译这些。即使您只在英语国家/地区分发您的应用,用户也可能将其默认设备语言环境设置为非英语语言。因此,请尝试使用美国Locale
。总结
指定
Locale
用于解析本地化文本PM
。使用现代java.time类,而不是旧式类。具体来说
java.time.LocalTime
。避免遗留类
您正在使用存在严重缺陷的遗留类,这些类多年前就被 JSR 310 中定义的现代java.time类所取代。
适用班级:
LocalTime
而且您正试图用表示带时间的日期的类来表示时间值 — 方枘圆凿。请使用适当的类:
LocalTime
。Locale
指定
Locale
来确定解析本地化 时要使用的人类语言和文化规范PM
。有些文化使用小写字母,pm
有些使用标点符号,p.m.
有些使用完全不同的文本。如果省略语言环境,则将隐式使用 JVM 当前的默认语言环境。该特定语言环境可能无法理解您的文本
PM
。示例代码
请参阅在 Ideone.com 上运行的此代码的旧版本。
安卓
Android 26+ 捆绑了java.time类的实现。对于早期版本的 Android,最新工具通过“API 脱糖”提供大部分功能。
ISO 8601
提示:交换/存储日期时间值时,请避免使用本地化文本。仅使用ISO 8601标准值。
对于一天中的时间,它将是 24 小时制,零秒是可选的,前导零和尾随零。因此,
18:00
对于下午 6 点。