实际开发中,经常需要将 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
格式化后 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 对象。