阿粉今天想介绍的实体时间,就是再用我们再实体类中,很多时候会用到时间这个概念,实体时间比如说,再用记录的实体时间创建时间Create_Time或者说是某些需要确定的日期,在数据库存储的再用时候,毋庸置疑,实体时间肯定是再用 datetime和date的数据类型,但是实体时间也有个别的比较过分,直接是再用用字符串,也就是实体时间varchar来进行存储,而我们在之前使用JDK7创建时间的再用时候,很多时候都选择的实体时间时比较老版本的 Date、Calendar 以及 SimpleDateFormatter 等等。再用 不过 java.util.Date 也是实体时间被诟病已久,它包含了日期、时间、毫秒数等众多繁杂的站群服务器信息,其内部利用午夜 12 点来区分日期,利用 1970-01-01 来计算时间;并且其月份从 0 开始计数,而且用于获得年、月、日等信息的接口也是太不直观。 除此之外,java.util.Date与 SimpleDateFormatter 都不是类型安全的, 而我们接下来要使用的,就是 JDK8 中的日期,用来替换掉之前使用的。 JDK7 创建一个时间: JDK8 创建一个时间: 我们先看看这执行出来都是啥? Date输出: LocalDate输出: 首先我们从输出上,直接就感觉有点难受,Date输出的看起来就不是那么的直观,所以,当你想要直观的去输出这个时间的时候,可能就得用到 SimpleDateFormat 去格式化一下我们的服务器租用这个时间。但是如果是用 LocalDate 就不会有这种顾虑了。 Date格式化: SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); 我们执行一下在看: JDK7格式化后的时间数据==2022-04-13 首先,从代码上,就直接少了很多,毕竟转换时间相对来说是非常简单的。 这时候就有人得喷阿粉,说如果我不想要这样的数据,那么我再JDK8 里面我怎么去转换这个时间呢? 我 JDK7 可以用 SimpleDateFormat,但是这个类并不支持我用 LocalDate 呀,别着急呀。既然人家敢出这个,那么肯定也得想到对应的方案。 JDK1.7及之前版本我们使用java.text.DataFormat 的子类(如SimpleDateFormat类)进行日期时间的格式化。 JDK1.8之后我们可以使用 java.time.format.DateTimeFormatter来进行日期时间的格式化。 LocalDate now = LocalDate.now(); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String JDK8Time = now.format(dateTimeFormatter); 我们看一下输出结果: JDK7格式化后的时间数据==2022/04/13 这属实没毛病是吧,但是,亿华云计算众所周知,SimpleDateFormat 是个线程不安全的,使用的时候,只能在方法内部创建新的局部变量。 而 DateTimeFormatter 不但是不变对象,它还是线程安全的。所以 DateTimeFormatter 可以只创建一个实例,到处引用。 这就是阿粉推荐大家换一下的原因,因为字符串转换时间的例子,用的地方实在是非常的多,我们在完成功能的同时,也需要尽量的保证自己代码的安全。 我们既然已经对比完成了,接下来就直接讲一下 JDK8 中的各种时间的用法。毕竟没有实战的空说,都是让人难以记忆的。 String 转 LocalDate: LocalDate localDate = LocalDate.now(); DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String dateStr = localDate.format(fmt); 转换结果: data转LocalDate: Date date = new Date(); 转换结果: 时间戳转LocalDateTime: long timestamp = System.currentTimeMillis(); Instant instant1 = Instant.ofEpochMilli(timestamp); 转换结果: 具体的API还有很多很多阿粉列举一下: 以上的API相对来说已经是比较全免的,可以满足日常开发的需求了,阿粉就不再一一的去测试了,如果是想看看结果的,大家不妨写个测试 Demo 去试试吧。