网站首页 > java教程 正文
今天想介绍的,就是我们再实体类中,很多时候会用到时间这个概念,比如说,记录的创建时间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 创建一个时间
Date date0 = new Date();
JDK8 创建一个时间
LocalDate today = LocalDate.now();
我们先看看这执行出来都是啥?
Date输出:
Wed Apr 13 13:19:06 CST 2022
LocalDate输出:
2022-04-13
首先我们从输出上,直接就感觉有点难受,Date输出的看起来就不是那么的直观,所以,当你想要直观的去输出这个时间的时候,可能就得用到 SimpleDateFormat 去格式化一下我们的这个时间。但是如果是用 LocalDate 就不会有这种顾虑了。
Date格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String str = sdf.format(date0);
我们执行一下在看
JDK7格式化后的时间数据==2022-04-13
JDK8的时间数据==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);
System.out.println("JDK8格式化后的时间数据=="+JDK8Time);
我们看一下输出结果:
JDK7格式化后的时间数据==2022/04/13
JDK8格式化后的时间数据==2022/04/13
这属实没毛病是吧,但是,众所周知,SimpleDateFormat 是个线程不安全的,使用的时候,只能在方法内部创建新的局部变量。
而 DateTimeFormatter 不但是不变对象,它还是线程安全的。所以 DateTimeFormatter 可以只创建一个实例,到处引用。
这就是阿粉推荐大家换一下的原因,因为字符串转换时间的例子,用的地方实在是非常的多,我们在完成功能的同时,也需要尽量的保证自己代码的安全。
我们既然已经对比完成了,接下来就直接讲一下 JDK8 中的各种时间的用法。毕竟没有实战的空说,都是让人难以记忆的。
JDK8 日期的各种用法
String 转 LocalDate
LocalDate localDate = LocalDate.now();
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String dateStr = localDate.format(fmt);
System.out.println("LocalDate转String:" + dateStr);
转换结果
LocalDate转String:2022/04/14
data转LocalDate
Date date = new Date();
System.out.println("LocalDateTime():" + (new Date()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
转换结果
LocalDateTime():2022-04-14T10:07:52.868
时间戳转LocalDateTime
long timestamp = System.currentTimeMillis();
Instant instant1 = Instant.ofEpochMilli(timestamp);
System.out.println("时间戳 转 LocalDateTime:" + LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()));
转换结果
时间戳 转 LocalDateTime:2022-04-14T10:09:14.780
具体的API还有很多很多阿粉列举一下:
以上的API相对来说已经是比较全免的,可以满足日常开发的需求了,阿粉就不再一一的去测试了,如果是想看看结果的,大家不妨写个测试 Demo 去试试吧。
原文:java极客说技术
猜你喜欢
- 2024-10-28 JDK8 新特性之新的日期&时间API,一篇讲清楚!
- 2024-10-28 日期时间API之TemporalAdjusters与TemporalAdjuster
- 2024-10-28 String为什么不可变(string 为什么不可变)
- 2024-10-28 四十五、Date与Calendar类在日期与时间处理中的关键作用
- 2024-10-28 深入解析Java中的String.format():格式化输出的艺术
- 2024-10-28 JAVA开发中使用Duration类设置时间长度
- 2024-10-28 DATE #4、Java操作日期时间-④.自定义时间调节器-放假通知
- 2024-10-28 Java学习笔记:String字符串格式化
- 2024-10-28 Java 计算日期属于当月第几周(日期周计算)
- 2024-10-28 GO项目实战—Gorm格式化时间字段(mongo时间格式化)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)