关于java:如何在Android中解析“yyyy-MM-dd’T’HH:mm:ss.SSSXXX”日期格式到简单?

How to parse “yyyy-MM-dd'T'HH:mm:ss.SSSXXX” date format to simple in Android?

本问题已经有最佳答案,请猛点这里访问。

如何在Android中解析此日期2018-01-09T11:11:02.0+03:00dd.MM.yyyy hh:mm格式?

0911之间的T是什么意思?
谢谢。

我不知道后端开发人员是如何获得这种格式的。
我正在使用Java。


1
2
3
4
5
6
    DateTimeFormatter desiredFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");

    String backendDateTimeString ="2018-01-09T11:11:02.0+03:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(backendDateTimeString);
    String presentationDateTimeString = dateTime.format(desiredFormatter);
    System.out.println(presentationDateTimeString);

这打印:

09.01.2018 11:11

请注意:我在格式模式字符串中使用大写HH。这表示从00到23的一天中的小时。在您使用小写HH的问题中,格式模式字符串表示从01到12的AM或PM的小时,因此00:33将表示为12:33和15 :47为03:47。我不认为你打算这样做。

你的后端开发人员获得的格式2018-01-09T11:11:02.0+03:00是ISO 8601.它很普遍,而且它是国际标准,所以他/她很好。中间的搞笑T表示时间部分的开始,将其与日期部分分开。 one-arg OffsetDateTime.parse方法解析ISO 8601,这就是我们不需要任何格式化器来解析的原因。 OffsetDateTimeDateTimeFormatter是来自java.time的类,现代Java日期和时间API。

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

是的,java.time适用于较旧和较新的Android设备。它至少需要Java 6。

  • 在Java 8及更高版本和更新的Android设备(API级别26及更高版本)上,内置了现代API。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保从子包中导入org.threeten.bp的日期和时间类(我的代码已使用这些导入进行测试)。

链接

  • Oracle教程:日期时间解释如何使用java.time
  • Java规范请求(JSR)310,其中首先描述了java.time
  • ThreeTen Backport项目,java.time的后端到Java 6和7(用于JSR-310的ThreeTen)。
  • ThreeTenABP,Android版ThreeTen Backport
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常详尽的解释。
  • 维基百科文章:ISO 8601

如果您使用的是java,则可以使用带有模式的SimpeDateFormat

1
2
3
4
5
6
7
8
9
10
11
12
        String date ="2018-01-09T11:11:02.0+03:00";
        SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
        SimpleDateFormat output = new SimpleDateFormat("dd.MM.yyyy hh:mm");
        Date d = null;
        try {
            d = dateformat.parse(date /*your date as String*/);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        String formattedDate = output.format(d);

        Log.d("Date format","output date :" + formattedDate);

输出是:

D/Date format: output date :09.01.2018 09:11

编辑:感谢@ OleV.V。,对于API> 26,或使用ThreeTenABP,我们可以使用

DateTimeFormatter,我们可以做类似的事情

1
2
3
4
5
6
7
    String date ="2018-01-09T11:11:02.0+03:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    DateTimeFormatter formatterOut = DateTimeFormatter.ofPattern("dd.MM.yyyy hh:mm");
    LocalDate parsedDate = LocalDate.parse(date, formatter);

    String formattedDate = formatterOut.format(parsedDate);
    Log.d("Date format","output date :" + formattedDate);


您可以使用SimpleDateFormat执行此操作。

以下是Java中的测试示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String dateString ="2018-01-09T11:11:02.0+03:00";

String inPattern ="yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
String outPattern ="dd.MM.yyyy hh:mm";

SimpleDateFormat inFormat = new SimpleDateFormat(inPattern, Locale.getDefault());
SimpleDateFormat outFormat = new SimpleDateFormat(outPattern, Locale.getDefault());

try {
    Date inDate = inFormat.parse(dateString);
    String outDate = outFormat.format(inDate);
    Log.e("TEST", outDate);
} catch (ParseException e) {
    e.printStackTrace();
}

这是Kotlin的一个经过测试的例子:

1
2
3
4
5
6
7
8
9
10
11
12
val dateString ="2018-01-09T11:11:02.0+03:00"

val inPattern ="yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
val outPattern ="dd.MM.yyyy hh:mm"

val inFormat = SimpleDateFormat(inPattern, Locale.getDefault())
val outFormat = SimpleDateFormat(outPattern, Locale.getDefault())

val inDate = inFormat.parse(dateString)
val outDate = outFormat.format(inDate)

Log.e("TEST", outDate)