Java 时间 Instant 格式化为 String

实际开发中,经常需要将 Instant 时间转换为字符串 String 格式。

Instant 时间

Java 8 引入了一个名为 Instant 的类,用于表示时间轴上的特定瞬时点。Instant 代表的是从 1970-01-01T00:00:00Z 到现在的的时间戳。

JDK 自带格式化类

toString

实际上,使用 toString() 方法也可以获取 Instant 对象的字符串表示形式。它得到的结果是一个标准的 ISO-8601 格式,即”yyyy-MM-dd’T’HH:mm:ss.SSSZ”。

private static void instantToString(){
    Instant instant = Instant.ofEpochMilli(1648828224030L);
    String string = instant.toString();
    System.out.println(string);
}
2022-04-01T15:50:24.030Z

DateTimeFormatter

Java 8 引入了 DateTimeFormatter 类来统一格式化日期和时间。

DateTimeFormatter 提供了 format() 方法来完成这项工作。

private static void printInstant(){
    String formatPattern = "yyyy-MM-dd";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern).withZone(ZoneId.systemDefault());

    Instant instant = Instant.now();
    String date = formatter.format(instant);
    System.out.println("格式化前 " + instant);
    System.out.println("格式化后 " + date);
}
格式化前 2022-04-03T02:29:23.841Z
格式化后 2022-04-03

DateTimeFormatter需要一个时区来格式化一个 Instant。没有时区,它将无法将 Instant 转换为人类可读的日期/时间字段。

private static void printInstant(){
    String formatPattern = "yyyy-MM-dd";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern);
}

上面的代码中,我们没有指定时区,将导致 UnsupportedTemporalTypeException:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.Instant.getLong(Instant.java:603)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2551)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2190)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at com.mapull.date.MapullOffsetDate.printInstant(MapullOffsetDate.java:29)
    at com.mapull.date.MapullOffsetDate.main(MapullOffsetDate.java:16)

第三方库

Java 生态中,有些第三方库也支持时间的转换,其中比较出名的便是 Joda-Time 库。

Joda-Time API

Joda-Time 提供了一组现成的类和接口,用于在 Java 中操作日期和时间。

该库中提供的 DateTimeFormat 类,可用于格式化或解析与 string 之间的日期/时间数据。

public void jodaTimeFormat() {
    String formatPattern = "yyyy-MM-dd";
    org.joda.time.Instant instant = new org.joda.time.Instant("2022-03-20T10:11:12");

    String formattedInstant = DateTimeFormat.forPattern(formatPattern)
        .print(instant);

    System.out.println("格式化后 " + date);
}
格式化后 2022-03-20

DateTimeFormatter 提供了 forPattern() 方法来初始化时间格式,并提供 print()来格式化 Instant 对象。

转载请注明出处:码谱记录 » Java 时间 Instant 格式化为 String
标签: