【问题标题】:ISO 8601 String to Date/Time object in AndroidISO 8601 字符串到 Android 中的日期/时间对象
【发布时间】:2011-04-25 21:02:09
【问题描述】:

我有一个标准 ISO 8601 格式的字符串,其中包含从 Web 服务返回的日期/时间,如下所示:

String dtStart = "2010-10-15T09:27:37Z"

如何将其放入时间或日期等对象中?我最初想以不同的格式输出它,但以后需要用它做其他事情(即可能以不同的格式使用)。

干杯

【问题讨论】:

标签: java android parsing iso8601


【解决方案1】:
String dtStart = "2010-10-15T09:27:37Z";  
SimpleDateFormat  format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");  
try {  
    Date date = format.parse(dtStart);  
    System.out.println(date);  
} catch (ParseException e) {  
    e.printStackTrace();  
}

这就是你要找的。有existing post关于这个问题。

【讨论】:

  • 非常感谢,我确实在此处和通过 Google 进行了查看,但从未找到任何符合我要求的内容
  • 所有支持的日期格式为:docs.oracle.com/javase/6/docs/api/java/text/…
  • 如果你也有毫秒,那么这种格式对我有用yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
【解决方案2】:

这个问题是在 2010 年提出的,当时您应该使用 SimpleDateFormat 或 Joda-Time 是正确的。现在已经很久了。今天使用

    Instant iStart = Instant.parse(dtStart);

是的,就是这么简单。您的字符串采用 ISO 8601 格式,并且来自现代 Java 日期和时间 API java.time 的类在没有任何显式格式化程序的情况下解析 ISO 8601。 Instant 只是其中一类。

编辑:问题:需要 android API 26 - 支持旧版本怎么样?

是的,java.time 在较旧和较新的 Android 设备上都能正常运行。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中,获取 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

  • 需要 android API 26 - 支持旧版本怎么样?
  • @ElJazouli 谢谢你的提问。我已经试图涵盖这一点,但我知道许多读者错过了这部分。我怎样才能让它更清楚?我编辑了相关的标题,但这可能还不够。
【解决方案3】:

您可以使用Java's SimpleDateFormat parse method 或使用JodaTime's DateTimeFormat 相应地创建一个DateTimeFormatter 和parse to a DateTime object

【讨论】:

    【解决方案4】:

    如果您使用当前的java.timethreetenbp,只需像这样解析它:

    ZonedDateTime dt = ZonedDateTime.parse(dtStart);
    

    现在您可以访问日期和时间值,例如年、月、小时等。

    【讨论】:

      【解决方案5】:

      假设您想在给定列分隔值的情况下计算时间差。
      完成 --> 15:24:04
      开始 --> 09:27:37
      不使用 DateSimpleDateFormat,我这样做了:

      String tStart = "09:27:37";
      String tFinish = "15:24:04";
      
      String[] sTimeHourMinSec = tStart.split(":");
      int sHour = Integer.valueOf(sTimeHourMinSec[0]);
      int sMin = Integer.valueOf(sTimeHourMinSec[1]);
      int sSec = Integer.valueOf(sTimeHourMinSec[2]);
      
      String[] fTimeHourMinSec = tFinish.split(":");
      int fHour = Integer.valueOf(fTimeHourMinSec[0]);
      int fMin = Integer.valueOf(fTimeHourMinSec[1]);
      int fSec = Integer.valueOf(fTimeHourMinSec[2]);
      
      int diffTotSec = (fHour - sHour) * 3600 + (fMin - sMin) * 60 + (fSec - sSec);
      int diffHours = diffTotSec / 3600;
      int diffMins = (diffTotSec % 3600) / 60;
      int diffSecs = (diffTotSec % 3600) % 60;
      
      System.out.println("Difference: " + diffHours + " h " + diffMins + " m " + diffSecs + " sec");
      

      【讨论】:

      • 我没有投反对票。您似乎在回答与您发布答案的问题完全不同的问题?!这也是过于复杂的方式。虽然避免像Date 这样过时的类和麻烦的SimpleDateFormat 是好的,但我们有库方法,不仅可以使工作更容易,而且代码更清晰,更不容易出错。看看java.time, the modern Java date and time API
      • 也不是我的反对票,但是 (a) 您的回答未能解决问题,(b) 自行处理日期时间几乎不是明智的建议。使用设计精美的 java.time 类来完成这项工作:Instant.parse( "2010-10-15T09:27:37Z" )。请参阅 Ole V.V. 的 correct Answer
      • 我投了反对票,因为它实际上并没有回答我最初提出的问题。
      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2017-04-29
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多