当我们从 JVM 调用
parseJavaAndroid("2018-04-27T22:31:07.962-05:00")
时,它会给出ParseException
,而从模拟器/Android 真实设备运行良好。当我们将
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH)
更改为SimpleDateFormat("yyyy-MM -dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH)
在 Android 中,它会抛出:IllegalArgumentException with message "Unknown pattern character 'X' method".
它在 JVM 中运行良好,并在模拟器/Android 真实设备中给出
ParseException
。
public static Date parseJavaAndroid(String fromDate){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH);
Date date=null;
try {
date = format.parse(fromDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
应该做什么才能在 JVM 和 android 实时设备中工作(minSdkVersion:19)。我想要“2018-04-27T22:31:07.962-05:00”的模式,它适用于 Android 和 Java。
注意:个人模式正在发挥作用,因此请不要向个人建议。
最佳答案
我无法告诉 Android,但在 JVM 中,Z
模式仅识别没有 :
的偏移量,例如 -0500
,而 X
模式可以识别 -05:00
:https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
也许 Android 有不同的实现,其中 Z
还可以识别带有 :
的偏移量,例如 -05:00
。
恐怕没有一种万能的解决方案:Z
在 JVM 中不起作用,X
在 Android 中不起作用,如何使其在两者中都起作用?我认为你能做的最好的事情就是尝试这两种模式,如下所示(伪代码):
try {
parse with X
} catch(Exception e) {
X didn't work, parse with Z
}
更好的替代方案是使用 threeten backport并配置ThreetenABP - 或使用java.time
classes如果您的 API 级别是 26:
// parse input
OffsetDateTime odt = OffsetDateTime.parse("2018-04-27T22:31:07.962-05:00");
// convert to java.util.Date (threeten backport)
Date date = DateTimeUtils.toDate(odt.toInstant());
// or, if you have java.time (API level 26)
Date date = date.from(odt.toInstant());
关于java - Java 和 Android 中的 SimpleDateFormat 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49673279/