在Android中将ISO 8601字符串转换为日期/时间对象

53

我有一个字符串,它是从Web服务返回的标准ISO 8601格式的日期/时间。

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

我该如何将这个时间转换为 Time 或 Date 对象?我最初想以不同的格式输出它,但稍后可能需要对其进行其他操作(例如可能会使用不同的格式)。

谢谢


5个回答

131
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();  
}

这就是你要找的东西。有一个关于这个问题的现有帖子

1
非常感谢,我确实在这里和通过Google搜索了,但从未找到符合我要求的东西。 - neildeadman
1
各位,支持的日期格式如下:http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html - JWL
3
如果你也有毫秒,那么这个格式对我有效:yyyy-MM-dd'T'HH:mm:ss.SSS'Z' - Manohar

7

这个问题是在2010年提出的,当时使用SimpleDateFormat或Joda-Time是你应该使用的工具。现在已经过去了很长时间。今天我们可以使用

    Instant iStart = Instant.parse(dtStart);

是的,很简单。您的字符串采用ISO 8601格式,并且来自于现代Java日期和时间API java.time 的类可以在没有任何显式格式化程序的情况下解析ISO 8601。其中Instant只是这些类之一。
编辑:问题:需要android API 26-如何支持旧版本?
是的,java.time在旧版和新版Android设备上都能正常工作。它只需要至少Java6.
  • 在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 - 那么支持旧版本怎么办? - TootsieRockNRoll
@ElJazouli 感谢您的提问。我已经尝试过涵盖这一部分,但我知道很多读者会忽略这一点。我该如何让它更清晰明了?我编辑了相关的标题,但也许这还不够。 - Ole V.V.

2

0
如果您使用当前的java.timethreetenbp,只需按照以下方式解析即可:
ZonedDateTime dt = ZonedDateTime.parse(dtStart);

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

-1
假设您想要计算给定列分隔值的时间差异。
finish --> 15:24:04
start --> 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");

我没有投反对票。你似乎在回答与你发布答案的完全不同的问题?而且这是一种过于复杂的方法。虽然避免使用像“日期”这样过时的类和麻烦的“SimpleDateFormat”是好的,但我们有库方法可以让工作更容易,代码更清晰,也更少出错。请看看 java.time, 现代的Java日期和时间API - Ole V.V.
不是我点的踩,但是(a)你的回答没有解决问题,(b)自己编写日期时间处理几乎从来都不是明智的建议。使用精心设计的java.time类来完成这项工作:Instant.parse("2010-10-15T09:27:37Z")。请参见Ole V.V.的正确答案 - Basil Bourque
1
我点了踩,因为它实际上并没有回答我最初提出的问题。 - neildeadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接