Instant 格式化为 String

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

Java 8 引入了一个名为 Instant 的类,用于表示时间轴上的特定瞬时点。Instant 代表的是从 1970-01-01T00:00:00Z 到现在的的时间戳。
2JDK 自带格式化类
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);
}

Java
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);
}

Java
格式化前 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);
}

Java

上面的代码中,我们没有指定时区,将导致 UnsupportedTemporalTypeExceptionException 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)

3第三方库

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

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

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

    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);
}

Java
格式化后 2022-03-20

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Instant和SimpleDateFormat是Java中处理时间格式化换的两个类。 1. Instant类是Java 8引入的一个时间类,用于表示时刻。它是不可变的,可以精确到纳秒级别,并且可以与时区无关。通过Instant类,我们可以方便地进行日期和时间的操作和计算。 2. SimpleDateFormat是一个旧的Java类,用于将Date对象格式化为指定的日期和时间字符串,或将日期和时间字符串解析为Date对象。它可以使用不同的模式来指定日期和时间的格式。 要将Instant对象换为指定格式的时间字符串,可以使用DateTimeFormatter类(Java 8及以上版本)或SimpleDateFormat类(Java 7及以下版本)。 例如,要将Instant对象换为"yyyy-MM-dd HH:mm:ss"格式的时间字符串,可以使用以下代码: Java 8及以上版本: ``` Instant instant = Instant.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = formatter.format(instant); ``` Java 7及以下版本: ``` Instant instant = Instant.now(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = formatter.format(Date.from(instant)); ``` 而要将指定格式的时间字符串解析为Instant对象,可以使用以下代码: Java 8及以上版本: ``` String dateTimeString = "2022-05-10 15:30:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); Instant instant = Instant.parse(dateTimeString, formatter); ``` Java 7及以下版本: ``` String dateTimeString = "2022-05-10 15:30:00"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = formatter.parse(dateTimeString); Instant instant = date.toInstant(); ``` 总结:Instant类是用于表示时刻的,SimpleDateFormat类是用于格式化和解析日期和时间字符串的。要将Instant对象换为指定格式的时间字符串,可以使用DateTimeFormatter类或SimpleDateFormat类;要将指定格式的时间字符串解析为Instant对象,也可以使用DateTimeFormatter类或SimpleDateFormat类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值