2024年网络安全最新java各个时间类总结归纳,超全一篇_java的几种时间类型(2)

本文介绍了Java8中的Instant类,一个不可变且线程安全的时间处理类,以及如何使用toInstant()和from()方法进行日期转换。重点讲解了LocalDateTime的使用,包括LocalDate、LocalTime和它们的组合,以及DateTimeFormatter的引入以实现格式化功能,避免了SimpleDateFormat的线程安全性问题。
摘要由CSDN通过智能技术生成
 * @implSpec
 * This class is immutable and thread-safe.
 * @since 1.8
 */
public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {}

有效时间范围是从-1000000000-01-01T00:00Z-1000000000-01-01T00:00Z,可以满足大部分场景下的时刻现实问题。

同时在java8提供了toInsatant()和from()两个方法用于Date和Instant之间的来回转换

System.out.println("toInstant() = "+date.toInstant());
System.out.println("from() = "+Date.from(instant));

输出

toInstant() = 2020-06-10T07:45:42.440Z
from() = Wed Jun 10 15:45:42 CST 2020

可以看到相互转换过程中的时区问题不需要我们考虑,会自动+08:00或者-08:00

比较头疼的一个事情就是java8没有针对Instant提供一个可供自定义的格式化类,所以这边我的解决方法是转换成LocalDateTime,再使用DateTimeFormatter来完成格式化。

System.out.println("Instant = " + LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

输出

Instant = 2020-06-10 16:02:26

这样就比较容易的解决了格式化的问题,当然你也可以自定义一个@config来完成对Instant的格式化,也不失为一种一劳永逸的方案。LocalDateTime和DateTimeFormatter在后面的内容中会做详细的介绍。

在讲解LocalDateTime之前我们先分别介绍一下LocalDateLocalTime,以便于能更深入地理解LocalDateTime

LocalDate和LocalTime

LocalDate

LocalDate首先是一个不可变类,默认格式为yyyy-MM-dd,其次它是一个只获取年月日的类,侧重点在日历而不是时间(这里我们需要把日历和时间这两个概念区分开)。

使用LocalDate.now()可以获取当前年月日,也可以使用LocalDate.of(year,month,dayOfMonth)来指定日期

public static void main(String[] args) {
  LocalDate today = LocalDate.now();
  System.out.println("LocalDate.now() = "+today);
  today = LocalDate.of(2020,06,10);
  LocalDate laterDate = today.plusDays(30);
  System.out.println("LocalDate.of() = "+today.toString());
  System.out.println("plusDays = "+laterDate.toString());
  System.out.println("new Date() = "+ new Date());
}

输出

LocalDate.now() = 2020-06-09
LocalDate.of() = 2020-06-10
plusDays = 2020-07-10
new Date() = Tue Jun 09 20:31:22 CST 2020

从这个例子可以对比看出LocalDateDate的不同。

同时作为一个访问器方法,LocalDate每次都是生成一个新的对象,而不是改变原有的对象的值。

可以从today.plusDays(30)中轻易地看到。与之类似的就是更改器方法,在java较早的版本中又一个类java.util.GregorianCalendar

public static void main(String[] args) {
  GregorianCalendar someDay = new GregorianCalendar(2020,06,9);
  System.out.println("before someDay = "+someDay.getTime());
  someDay.add(Calendar.DAY_OF_MONTH,30);
  System.out.println("after someDay = "+someDay.getTime());
}

输出

before someDay = Thu Jul 09 00:00:00 CST 2020
after someDay = Sat Aug 08 00:00:00 CST 2020

可以看到someDay的值随着函数add的调用一直在变化着,这与LocalDate大不一样,这是需要注意的一个点。

这边还需要注意一个点是localDate.getDayOfWeek().getValue(),LocalDate对于一周的枚举计数和Calendar有些不一样。

LocalDate一周是从周一开始计数对应的value值为1,周日结束对应的value值为7。

而Calendar一周是从周日开始计数对应的value值为1,周六结束对应的value为7,相比较下个人觉得LocalDate更加合理和好用一些。

LocalDate常用的方法如下:

图片来自java核心技术卷2

LocalTime

LocalTimeLocalDate类似同样是一个不可变类,默认格式是HH:mm:ss.zzz,可以看到它所关注的是当前的时刻。

public static void main(String[] args) {
  LocalTime localTime = LocalTime.now();
  System.out.println("LocalTime.now() = "+localTime);
  localTime = LocalTime.of(8,8,8,888);
  System.out.println("LocalTime.of() = "+localTime);
  LocalTime laterTime = localTime.plusHours(2);
  System.out.println("localTime.plusHours() = "+laterTime);
  //根据时区获取当前时刻,同理适用与LocalDate
  LocalTime newlocalTime = LocalTime.now(ZoneId.of("America/New_York"));
  System.out.println("America/New_York Time = "+newlocalTime);
}

输出

LocalTime.now() = 20:58:54.941
LocalTime.of() = 08:08:08.000000888
localTime.plusHours() = 10:08:08.000000888
America/New_York Time = 08:58:54.944

这里我们会发现,尽管LocalTime默认的格式为HH:mm:ss.zzz,但是纳秒级别的精度它也是能支持的08:08:08.000000888。LocalTime常用的方法如下:

图片

java核心技术卷2

LocalDateTime

经过对LocalDate和LocalTime的介绍,LocalDateTime相信大家也已经知道如何使用了。

LocalDateTime也是一个不可变类线程安全,它的默认格式为yyyy-MM-ddTHH:mm:ss.zzz,显然在日常的web开发过程中我们都会对这样的日期格式进行格式化,这就是我这边特别要提的一点了。

之前我们讲过java.text.SimpleDateFormat可以自定义格式化时间格式,但是他并不是线程安全的类,所以java8开始配合LocalDateTime提供了java.time.format.DateTimeFormatter来搞定这个问题。

 * @implSpec
 * This class is immutable and thread-safe.
 *
 * @since 1.8
 */
public final class DateTimeFormatter

这是官方对他的介绍,这个类是不可变并且是线程安全的。所以我们可以放心地用了。

但是友情提醒下线程安全+线程安全不一定线程安全,不要误解了,这里就不展开讨论了。下面我们和SimpleDateFormat一起对比着来使用一下。

// LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();
String newLocalDateTime = localDateTime.format(DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss"));
System.out.println("LocalDateTime =  "+localDateTime);
System.out.println("DateTimeFormatter 格式化后的时间 = "+newLocalDateTime);

//Date
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
System.out.println("new Date() = "+date);
String s = simpleDateFormat.format(date);
System.out.println("SimpleDateFormat 格式化Date后 = "+s);

输出

LocalDateTime =  2020-06-10T14:41:02.546
DateTimeFormatter 格式化后的时间 = 2020-06-10 14:41:02
new Date() = Wed Jun 10 14:41:02 CST 2020
SimpleDateFormat 格式化Date后 = 2020-06-10 14:41:02

从代码量上就可以看到DateTimeFormatter的优势了,一行搞定

相比一下SimpleDateFormat每次都要new一个对象,在极端情况下就会导致创建很多实例短时间无法回收而浪费很多内存空间,当然我们也可以通过使用静态变量通过添加synchronized来达到目的,但是同步块不可避免的问题就是阻塞。

当然你一定会说我可以使用ThreadLocal来创建副本来解决SimpleDateFormat的线程安全问题。这个是比较好的一个解决方案,如下:

private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
  @Override
  protected DateFormat initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  }
};

System.out.println("ThreadLocal = "+threadLocal.get().format(date));

输出

ThreadLocal = 2020-06-10 14:52:05
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/fe39fdfc2c3bf2af0efdce5534768063.png)
![img](https://img-blog.csdnimg.cn/img_convert/43818becf69ec518aa9d7f71d711ce6a.png)
![img](https://img-blog.csdnimg.cn/img_convert/4b75e4ac2ac9fa09aa7d2a3f42423039.png)
![img](https://img-blog.csdnimg.cn/img_convert/e660e74ce6a48097d8eb91db307cc93b.png)
![img](https://img-blog.csdnimg.cn/img_convert/b5a2f03ced6e1b1835c69fe17204aa5a.png)
![img](https://img-blog.csdnimg.cn/img_convert/6dea9ad3c7bdcbf091792f6f634d5f2f.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
6421)]
[外链图片转存中...(img-VFzMCQIy-1714743046421)]
[外链图片转存中...(img-81LAB2CI-1714743046422)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值