文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-02 03:28

关注

不过 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极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯