【问题标题】:How to parse a ISO 8601 String to Java Date on Android [duplicate]如何在 Android 上将 ISO 8601 字符串解析为 Java 日期 [重复]
【发布时间】:2014-11-21 15:11:45
【问题描述】:

我正在 Android 上创建一个与服务器通信的应用程序。该服务器返回一个ISO 8601 日期字符串,如下所示:

2014-11-21 12:24:56.662061-02

然后我尝试使用 Java 的 SimpleDateFormatter 来解析我的字符串,如下所示:

        Locale l = new Locale("pt","BR");
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSZZ",l).parse(str_date);
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(date.getTime());

问题是,这个解决方案部分有效。我能够正确地得到年、月、日和小时,但是当它归结为小时、分钟和秒时,我总是把分钟弄错。如果我尝试使用示例字符串打印它,我会得到类似“12:35”而不是“12:24”的内容。我尝试了不同的掩码,使用区域设置,而不是使用区域设置,但似乎没有什么对我有用。

我在link 上看到 SimpleDateFormatter 不太支持 ISO 8601,并且那个人使用 javax.xml.bind.DatatypeConverter.parseDateTime() 方法给出了解决方案,但是 DatatypeConverter 不存在在 Android SDK 上。那么......我该怎么做才能正确解析这个字符串?

【问题讨论】:

  • 您的示例缺少一个“T”,实际上是 ISO 8601...但是您的格式似乎可以处理这个问题。 SimpleDateFormat 的示例只使用了一个“Z”字符,也许这就是问题所在?另外,你的“S”太多了...... 永远不会超过 3 位数字,所以“SSS”应该这样做。
  • 好吧,我尝试了许多不同的掩码,使用三重 S 的掩码引发了异常。我也尝试使用单个 Z,但它不起作用。

标签: java android date


【解决方案1】:

S 是毫秒; 662061 是 662 秒 = 11 分钟。

以某种方式丢弃微秒,并使用 SSS。

str_date = str_date.replaceFirst("(\\d\\d[\\.,]\\d{3})\\d+", "$1");

【讨论】:

  • 我会试试的!谢谢!
  • 成功了!我已经使用了您的代码并将掩码更改为“SSSZ”并且它有效!非常感谢!
猜你喜欢
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多