【问题标题】:Is SimpleDateFormat in Java and Android different?Java 和 Android 中的 SimpleDateFormat 是否不同?
【发布时间】:2018-09-15 07:55:31
【问题描述】:
  1. 当我们从 JVM 调用 parseJavaAndroid("2018-04-27T22:31:07.962-05:00") 时,它会给出 ParseException,而从 Emulator/Android Real 设备调用它可以正常工作。

  2. 当我们在 Android 中将 SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH) 更改为 SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH) 时,它会抛出:

    带有消息“未知模式字符'X'方法”的IllegalArgumentException。

    它在 JVM 中运行良好,并在 Emulator/Android Real 设备中提供 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

注意:个人模式有效,所以请不要为个人建议。

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 你肯定是太努力了。接受Answer by picit 中的建议,改为使用 java.time 类。这样做更容易:OffsetDateTime.parse("2018-04-27T22:31:07.962-05:00") 并完成它。遗留的日期时间类真的是一团糟。

标签: java android date datetime jvm


【解决方案1】:

Android我不知道,但是在JVM中,Z模式只能识别没有:的偏移量,比如-0500,而X模式可以识别-05:00https://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 进行配置 - 如果您的 API 级别为 26,则使用 java.time classes

// 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());

【讨论】:

  • API 24 以下的 Android 中没有“X”。
  • 使用threeten backport的另一个理由。 SimpleDateFormat 已过时,建议使用 backport(或 java.time,如果可用)。无论如何,另一种选择是尝试两种模式(ZX)——这保证了它可以在两种环境中工作
  • 如何同时尝试 z 或 x 模式?你会给出那个模式吗?
  • 尝试一个,捕获异常,尝试另一个
【解决方案2】:

根据您的示例和android doc,您应该使用X (ISO8601) 而不是Z(RFC822)

给出:"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

【讨论】:

  • 如第 2 点所述。在模式中添加“X”会导致 IllegalArgumentException 在 Emulator/Android Real 设备中出现消息“未知模式字符 'X'”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多