惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V2EX - 技术
V2EX - 技术
L
LangChain Blog
IT之家
IT之家
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
U
Unit 42
B
Blog RSS Feed
GbyAI
GbyAI
Microsoft Security Blog
Microsoft Security Blog
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
Vercel News
Vercel News
S
Schneier on Security
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 叶小钗
雷峰网
雷峰网
博客园_首页
人人都是产品经理
人人都是产品经理
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
T
Tor Project blog
L
Lohrmann on Cybersecurity
Know Your Adversary
Know Your Adversary
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cybersecurity and Infrastructure Security Agency CISA
P
Privacy International News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tenable Blog
V
Vulnerabilities – Threatpost
大猫的无限游戏
大猫的无限游戏
博客园 - 【当耐特】
V
V2EX
Security Latest
Security Latest
A
About on SuperTechFans
Cloudbric
Cloudbric
S
Security Affairs
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
TaoSecurity Blog
TaoSecurity Blog

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享
文章作者: LarsCheng · 2020-07-10 · via Java技术经验分享

前言

在Java8中,对于日期、时间、时间日期有不同的对象来表示,分别就是LocalDate、LocalTime、LocalDateTime

他们都位于java.time包下,并且他们都仅单纯的表示一个不可变的时间对象,无时区等附加信息的出现

一个不可变的时间对象用来表示一个日期(年月日),仅包含日期,例如2020-06-06

它的可表示范围为-999999999-01-01+999999999-12-31

LocalTime

一个不可变的时间对象,用来表示一个时间(时分秒),最高精度为纳秒,例如11:11:11
它的表示范围为:00:0023:59:59.999999999

LocalDateTime

一个不可变的时间对象,用来表示一个日期时间(年月日时分秒),最高精度为纳秒,例如2020-06-06T13:45:30.123456789
-999999999-01-01T00:00:00+999999999-12-31T23:59:59.999999999

LocalDate常用方法示例

LocalDate、LocalTime、LocalDateTime三者的使用方式基本相同,APi设计也类似,可以说掌握其中一个明白其他两个的用法了

此处以LocalDate的常用方法进行介绍:

初始化一个LocalDate

  • now(…)系列: 获取当前日期
  • of(…)系列 : 获取指定年月日日期
  • parse(…)系列: 将日期字符串转换为LocalDate日期
  • from(…)系列:将TemporalAccessor类型对象转换为LocalDate日期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*now()*/
System.out.println(LocalDate.now());//获取当前日期
System.out.println(LocalDate.now(ZoneId.systemDefault()));//获取系统时区当前日期
System.out.println(LocalDate.now(Clock.systemDefaultZone()));//获取系统时钟当前日期
/*of()*/
System.out.println(LocalDate.of(2020, 6, 6));//获取指定年月日日期
System.out.println(LocalDate.of(2020, Month.JUNE, 6));//获取指定年月日日期
System.out.println(LocalDate.ofEpochDay(10));//获取大于1970-1-1多少天的日期
System.out.println(LocalDate.ofYearDay(2020, 200));//获取指定年份中的第几天的日期
/*parse()*/
System.out.println(LocalDate.parse("2017-05-05"));//DateTimeFormatter.ISO_LOCAL_DATE
System.out.println(LocalDate.parse("2017-05-05", DateTimeFormatter.ISO_DATE));
System.out.println(LocalDate.parse("20170505", DateTimeFormatter.BASIC_ISO_DATE));
System.out.println(LocalDate.parse("2017-05-05+01:00", DateTimeFormatter.ISO_OFFSET_DATE));
/*from()*/
LocalDate.from(LocalDate.parse("2017-05-05"));//将TemporalAccessor类型对象转换为LocalDate日期

获取LocalDate中的信息

从已有的LocalDate中获取年、月、日等具体信息

  • get…()系列
  • 其他
1
2
3
4
5
6
7
8
9
10
11
LocalDate localDate = LocalDate.now();
System.out.println(localDate.getYear());//获取年
System.out.println(localDate.getMonthValue());//月
System.out.println(localDate.getDayOfMonth());//日
System.out.println(localDate.getMonth());//月份
System.out.println(localDate.getDayOfWeek());//星期
System.out.println(localDate.getDayOfYear());//本年中的第几天

System.out.println("是否闰年:"+localDate.isLeapYear());
System.out.println("本月天数:"+localDate.lengthOfMonth());
System.out.println("本年天数:"+localDate.lengthOfYear());

修改LcoalDate的内容

可以对现有的LcoalDate对象进行修改

  • plusxxx()系列
  • minusxxx()系列
  • withxxx()系列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
LocalDate localDate = LocalDate.now();
System.out.println("当前日期:"+localDate);
System.out.println("3天后:"+localDate.plusDays(3));
System.out.println("1月后:"+localDate.plusMonths(1));
System.out.println("1年后:"+localDate.plusYears(1));
System.out.println("1周后:"+localDate.plusWeeks(1));
System.out.println("3天前:"+localDate.minusDays(3));
System.out.println("1月前:"+localDate.minusMonths(1));
System.out.println("1年前:"+localDate.minusYears(1));
System.out.println("1周前:"+localDate.minusWeeks(1));

System.out.println(localDate.withYear(2012));//指定某一年的今天
System.out.println(localDate.withMonth(12));//指定某月的今天
System.out.println(localDate.withDayOfMonth(1));//指定本月的第几天
System.out.println(localDate.withDayOfYear(1));//指定今年的第几天

三者之间的转化关系

既然上面的三个类是分别代表时间、日期、日期时间,那他们必定存在相互转化的关系

就这个关系,我们进行代码示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LocalDate localDate = LocalDate.of(2020,1,1);
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

LocalDate ldt2ld = localDateTime.toLocalDate();
LocalTime ldt2lt = localDateTime.toLocalTime();
//localDateTime--->LocalDate
System.out.println(localDateTime+"---> localDateTime.toLocalDate() --->"+ldt2ld);
//localDateTime--->LocalTime
System.out.println(localDateTime+"---> localDateTime.toLocalTime() --->"+ldt2lt);

LocalDateTime atDate = localTime.atDate(localDate);
LocalDateTime atTime = localDate.atTime(localTime);
LocalDateTime dateTime = LocalDateTime.of(localDate, localTime);
//localDate+localTime--->LocalDateTime
System.out.println("["+localDate+" + "+localTime+"] localDate.atTime(localTime) --->"+atTime);
System.out.println("["+localDate+" + "+localTime+"] localTime.atDate(localDate) --->"+atDate);
System.out.println("["+localDate+" + "+localTime+"] LocalDateTime.of(localDate, localTime) --->"+dateTime);

输出结果

1
2
3
4
5
2020-07-10T17:02:47.711---> localDateTime.toLocalDate() --->2020-07-10
2020-07-10T17:02:47.711---> localDateTime.toLocalTime() --->17:02:47.711
[2020-01-01 + 17:02:47.710] localDate.atTime(localTime) --->2020-01-01T17:02:47.710
[2020-01-01 + 17:02:47.710] localTime.atDate(localDate) --->2020-01-01T17:02:47.710
[2020-01-01 + 17:02:47.710] LocalDateTime.of(localDate, localTime) --->2020-01-01T17:02:47.710

总结

本文介绍的三个类,属于java时间库中较为常用的三个类,它代替了java8以前常用的Date和Calendar类,转变为以更加细粒度的时间、日期、时间日期概念进行时间处理。