当前位置: 首页 > 科技观察

实体类不再使用Date,JDK8有了新的时间

时间:2023-03-18 00:52:13 科技观察

今天要介绍的是我们在实体类中经常会用到时间的概念。比如记录的创建时间Create_Time或者一些需要判断的日期,存入数据库的时候无疑必须是datetime和date数据类型,但是也有个别的太多了,直接用字符串存,那就是,varchar,而我们之前在创建JDK7的时候,很多时候选择了老版本的Date、Calendar和SimpleDateFormatter。但是,java.util.Date也被诟病了很久。它包含许多复杂的信息,例如日期、时间和毫秒。它使用半夜12点来区分日期,并使用1970-01-01来计算时间;而且它的月份从0开始计数,获取年月日等的界面太不直观了。另外,java.util.Date和SimpleDateFormatter不是类型安全的,接下来我们要用的是JDK8中的日期来代替之前的。JDK7的日期和JDK8的日期对比。JDK7创建时间:Datedate0=newDate();JDK8创建时间:LocalDatetoday=LocalDate.now();我们来看看执行了什么?Dateoutput:WedApr1313:19:06CST2022LocalDateoutput:2022-04-13首先直接从输出上我们感觉有点不爽。Date的输出看起来并不是那么直观,所以当你想要直观的输出这个时间的时候,我们可能就要用到SimpleDateFormat来格式化我们的时间了。但是如果你使用LocalDate,你就没有这个顾虑了。日期格式:SimpleDateFormatsdf=newSimpleDateFormat("yyyyyearMMmonthdddayHHhourmmminutesssecond");字符串str=sdf.format(date0);我们执行一下看看:JDK7格式化时间数据==2022-04-13JDK8时间数据==2022-04-13首先从代码上看,直接少了很多,毕竟转换时间比较简单。这时候就得有人喷个粉了,说如果我不要这样的数据,我这次在JDK8中怎么转换呢?我可以在JDK7中使用SimpleDateFormat,但是这个类不支持我使用LocalDate,不用担心。人既然敢这么想,那肯定也要想出相应的解决办法。在JDK1.7及以前的版本中,我们使用java.text.DataFormat的子类(如SimpleDateFormat类)来格式化日期和时间。JDK1.8以后,我们可以使用java.time.format.DateTimeFormatter来格式化日期和时间。LocalDate现在=LocalDate.now();DateTimeFormatterdateTimeFormatter=DateTimeFormatter.ofPattern("yyyy/MM/dd");StringJDK8Time=now.format(dateTimeFormatter);System.out.println("JDK8格式时间数据=="+JDK8Time);我们看一下输出结果:JDK7格式化时间数据==2022/04/13JDK8格式化时间数据==2022/04/13这是真的吧?但是,众所周知,SimpleDateFormat不是线程安全的。使用时,只能在方法内部创建新的局部变量。而DateTimeFormatter不仅是一个不可变的对象,它还是线程安全的。所以DateTimeFormatter只能创建一个实例并到处引用它。这也是为什么阿芬建议大家改一下,因为很多地方都会用到字符串转换时间的例子。我们需要在完成功能的同时尽可能保证我们代码的安全。对比完了,下面说说JDK8中各个时间的用法。毕竟没有实战的空谈是很难让人记住的。JDK8日期String转LocalDate的各种用法:LocalDatelocalDate=LocalDate.now();DateTimeFormatterfmt=DateTimeFormatter.ofPattern("yyyy-MM-dd");StringdateStr=localDate.format(fmt);System.out.println("本地日期到字符串:"+dateStr);转换结果:LocalDatetoString:2022/04/14datatoLocalDate:Datedate=newDate();System.out.println("LocalDateTime():"+(newDate()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());转换结果:LocalDateTime():2022-04-14T10:07:52.868TimestamptoLocalDateTime:longtimestamp=System.currentTimeMillis();Instantinstant1=Instant.ofEpochMilli(timestamp);System.out.println("LocalDateTime的时间戳:"+LocalDateTime.ofInstant(instant1,ZoneId.systemDefault()));转换结果:TimestamptoLocalDateTime:2022-04-14T10:09:14.780还有很多具体的API。罗列一下:以上API比较自由,可以满足日常开发的需要。我不会一一测试它们。是的,如果你想看到结果,不妨写个测试Demo试试看。