如何将 "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 日期格式解析为 Android 中的简单日期格式?

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

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

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

不知道后端开发者是怎么弄到这个格式的。 我正在使用 Java.

您可以使用 SimpleDateFormat 来做到这一点。

这是Java中的测试示例:

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中的一个测试示例:

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)

如果您使用 java,您可以使用 SimpeDateFormat 模式:

        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,我们可以这样做

    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);
    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。它很普遍,而且是国际标准,所以 s/he 得到它很好。中间那个搞笑的T表示时间部分的开始,用来和日期部分分开。一个参数 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,新 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类(我的代码已使用这些导入进行测试)。

链接