关于Java:Android中ISO 8601字符串转换为Date / Time对象

ISO 8601 String to Date/Time object in Android

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

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

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

干杯


1
2
3
4
5
6
7
8
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();  
}

这就是您要寻找的。有关于此问题的现有文章。


这个问题是在2010年提出的,那时应该使用SimpleDateFormat或Joda-Time是正确的。现在已经有一段时间了。今天使用

1
    Instant iStart = Instant.parse(dtStart);

是的,就是这么简单。您的字符串采用ISO 8601格式,现代Java日期和时间API java.time中的类无需任何显式格式化程序即可解析ISO 8601。 Instant只是那些类之一。

问题:我可以在Android上使用java.time吗?

是的,java.time在较新的Android设备上都能很好地工作。它至少需要Java 6。

  • 在Java 8和更高版本以及更新的Android设备(我知道API级别为26)上,内置了现代API。
  • 在Java 6和7中,获取ThreeTen Backport,即新类的Backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用Android版本的ThreeTen Backport。叫做ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接

  • Oracle教程:日期时间,说明如何使用java.time
  • Java Specification Request(JSR)310,其中首先描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的反向端口(JSR-310的ThreeTen)。
  • ThreeTenABP,ThreeTen Backport的Android版
  • 问题:如何在Android Project中使用ThreeTenABP,并有非常详尽的说明。
  • 维基百科文章:ISO 8601


您可以使用Java的SimpleDateFormat解析方法或使用JodaTime的DateTimeFormat创建DateTimeFormatter并相应地解析为DateTime对象


假设您要根据列分隔值计算时间差。
完成-> 15:24:04
开始-> 09:27:37
不使用Date和SimpleDateFormat,我这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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");