java8新特性LocalDate、LocalTime、LocalDateTime的学习
以前操作时间都是使用SimpleDateFormat类改变Date的时间格式,使用Calendar类操作时间。但是SimpleDateFormat是线程不安全的,源码如下:
- private StringBuffer format(Date date, StringBuffer toAppendTo,
- FieldDelegate delegate) {
- // Convert input date to time field list
- calendar.setTime(date);
- boolean useDateFormatSymbols = useDateFormatSymbols();
- for (int i = 0; i < compiledPattern.length; ) {
- int tag = compiledPattern[i] >>> 8;
- int count = compiledPattern[i++] & 0xff;
- if (count == 255) {
- count = compiledPattern[i++] << 16;
- count |= compiledPattern[i++];
- }
- switch (tag) {
- case TAG_QUOTE_ASCII_CHAR:
- toAppendTo.append((char)count);
- break;
- case TAG_QUOTE_CHARS:
- toAppendTo.append(compiledPattern, i, count);
- i += count;
- break;
- default:
- subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols);
- break;
- }
- }
- return toAppendTo;
- }
所以JAVA8推出了LocalDate、LocalTime、LocalDateTime是线程安全、简易、高可靠的时间包。源码如下

LocalDate 获取年月日
- @Test
- public void localDataTest(){
- //创建LocalDate获取当前年月日
- LocalDate now = LocalDate.now();
- System.out.println("当前时间:" + now);
- //构造指定的年月日
- LocalDate localDate = LocalDate.of(2020, 11, 24);
- System.out.println("当前指定时间:" + localDate);
- int year = now.getYear();
- System.out.println("当前年year:" + year);
- int year1 = now.get(ChronoField.YEAR);
- System.out.println("当前年year1:" + year1);
- Month month = now.getMonth();
- System.out.println("当前月month:" + month);
- int month1 = now.get(ChronoField.MONTH_OF_YEAR);
- System.out.println("当前月month1:" + month1);
- int day = now.getDayOfMonth();
- System.out.println("当前天day:" + day);
- int day1 = now.get(ChronoField.DAY_OF_MONTH);
- System.out.println("当前天day1:" + day1);
- DayOfWeek dayOfWeek = now.getDayOfWeek();
- System.out.println("当前星期几dayOfWeek:" + dayOfWeek);
- int dayOfWeek1 = now.get(ChronoField.DAY_OF_WEEK);
- System.out.println("当前星期几dayOfWeek1:" + dayOfWeek1);
- }
- @Test
LocalTime 获取时分秒
- @Test
- public void localTimeTest(){
- //创建LocalTime获取当前时分秒
- LocalTime now = LocalTime.now();
- System.out.println("当前时间:" + now);
- LocalTime localTime = LocalTime.of(13, 51, 10);
- System.out.println("指定时间:" + localTime);
- int hour = now.getHour();
- System.out.println("当前小时数hour:"+ hour);
- int hour1 = now.get(ChronoField.HOUR_OF_DAY);
- System.out.println("当前小时数hour1:"+ hour1);
- int minute = now.getMinute();
- System.out.println("当前分钟数minute:"+ minute);
- int minute1 = now.get(ChronoField.MINUTE_OF_DAY);
- System.out.println("当前分钟数minute1:"+ minute1);
- int second = now.getSecond();
- System.out.println("当前秒数second:"+ second);
- int second1 = now.get(ChronoField.SECOND_OF_MINUTE);
- System.out.println("当前秒数second1:"+ second1);
- }
- @Test
LocalDateTime 获取年月日时分秒,相当于LocalDate+LocalTime,可与LocalDate、LocalTime相互转换
- @Test
- public void localDataTimeTest(){
//创建localDateTime获取当前年月日时分秒 - LocalDateTime localDateTime = LocalDateTime.now();
- System.out.println("当前时间:" + localDateTime);
- LocalDateTime localDateTime1 = LocalDateTime.of(2020, Month.SEPTEMBER, 10, 14, 46, 56);
- System.out.println("指定时间:" + localDateTime1);
- LocalDateTime of = LocalDateTime.of(LocalDate.now(), LocalTime.now());
- System.out.println("当前时间1:" + of);
- LocalDateTime localDateTime2 = LocalDate.now().atTime(LocalTime.now());
- System.out.println("当前时间2:" + localDateTime2);
- LocalDateTime localDateTime3 = LocalTime.now().atDate(LocalDate.now());
- System.out.println("当前时间3:" + localDateTime3);
- LocalDate localDate = localDateTime.toLocalDate();
- System.out.println("当前年月日:" + localDate);
- LocalTime localTime = localDateTime.toLocalTime();
- System.out.println("当前时分秒:" + localTime);
- }
- @Test
Period 时间长度类 Period表示以年、月、日衡量的时长,通过Period增加、减少年月日
- @Test
- public void periodTest(){
- //创建localDateTime获取当前年月日时分秒
- LocalDateTime localDateTime = LocalDateTime.now();
- //创建Period对象,设置一年
- Period period = Period.ofYears(1);
- //增加一年
- LocalDate localDate = localDateTime.toLocalDate().plus(period);
- System.out.println("增加一年后的时间:" + localDate);
- Period period1 = Period.ofYears(-1);
- //减少一年
- LocalDate localDate1 = localDateTime.toLocalDate().plus(period1);
- System.out.println("减少一年后的时间:" + localDate1);
- //创建Period对象,设置一月
- Period period2 = Period.ofMonths(1);
- //增加一个月
- LocalDate localDate2 = localDateTime.toLocalDate().plus(period2);
- System.out.println("增加一个月后的时间:" + localDate2);
- //创建Period对象,设置一周
- Period period3 = Period.ofWeeks(1);
- //增加一周
- LocalDate localDate3 = localDateTime.toLocalDate().plus(period3);
- System.out.println("增加一周后的时间:" + localDate3);
- //创建Period对象,设置一天
- Period period4 = Period.ofDays(1);
- //增加一天
- LocalDate localDate4 = localDateTime.toLocalDate().plus(period4);
- System.out.println("增加一天后的时间:" + localDate4);
- }
- @Test
Duration 时间长度类 Duration表示以时、分、秒衡量的时长,通过Duration增加、减少时分秒
- @Test
- public void durationTest(){
- //创建localDateTime获取当前时间时分秒
- LocalDateTime localDateTime = LocalDateTime.now();
- //创建Duration对象,设置1天
- Duration duration = Duration.ofDays(1);
- //增加一天
- LocalTime localTime = localDateTime.toLocalTime().plus(duration);
- System.out.println("增加一天后时间:" + localTime);
- //创建Duration对象,设置一小时
- Duration duration1 = Duration.ofHours(-1);
- //减少一天
- LocalTime localTime1 = localDateTime.toLocalTime().plus(duration1);
- System.out.println("增加一天后时间:" + localTime1);
- //创建Duration对象,设置一小时
- Duration duration2 = Duration.ofHours(1);
- //增加一小时
- LocalTime localTime2 = localDateTime.toLocalTime().plus(duration2);
- System.out.println("增加一小时后时间:" + localTime2);
- //创建Duration对象,设置一分钟
- Duration duration3 = Duration.ofMinutes(1);
- //增加一分钟
- LocalTime localTime3 = localDateTime.toLocalTime().plus(duration3);
- System.out.println("增加一分钟后时间:" + localTime3);
- //创建Duration对象,设置十秒钟
- Duration duration4 = Duration.ofSeconds(10);
- //增加十秒钟
- LocalTime localTime4 = localDateTime.toLocalTime().plus(duration4);
- System.out.println("增加十秒钟后时间:" + localTime4);
- //创建Duration对象,设置一百毫秒
- Duration duration5 = Duration.ofMillis(100);
- //增加一百毫秒
- LocalTime localTime5 = localDateTime.toLocalTime().plus(duration5);
- System.out.println("增加一百毫秒后时间:" + localTime5);
- }
- @Test
ZonedDateTime 时区处理类 可以设置时区
- @Test
- public void zonedDateTimeTest(){
- ZoneId zoneId = ZoneId.of("UTC+1");
- //设置指定时间、时区
- ZonedDateTime zonedDateTime = ZonedDateTime.of(2020, 11, 24, 15, 29, 53, 1026, zoneId);
- //获取今天是今年第几天
- int dayOfYear = zonedDateTime.getDayOfYear();
- System.out.println("今天是今年第"+dayOfYear+"天");
- //获取今天是这月第几天
- int dayOfMonth = zonedDateTime.getDayOfMonth();
- System.out.println("今天是这月第"+dayOfMonth+"天");
- //获取今天是这周第几天
- int dayOfWeek = zonedDateTime.getDayOfWeek().get(ChronoField.DAY_OF_WEEK);
- System.out.println("今天是这周第"+dayOfWeek+"天");
- //增加一年
- ZonedDateTime zonedDateTime1 = zonedDateTime.plusYears(1);
- System.out.println("增加一年后的时间:"+zonedDateTime1);
- //减少一年
- ZonedDateTime zonedDateTime2 = zonedDateTime.minusYears(1);
- System.out.println("减少一年后的时间:"+zonedDateTime2);
- }
- @Test
java8新特性LocalDate、LocalTime、LocalDateTime的学习的更多相关文章
- Java8 新特性学习
摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...
- 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)
1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...
- java8新特性学习:函数式接口
本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- java8 新特性学习笔记
Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...
- 干货 | Java8 新特性教程
本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...
- java8 新特性精心整理(全)
前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...
- Java8新特性时间日期库DateTime API及示例
Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...
- Java8 新特性(三) - 日期时间对象以及一些其他特性
日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...
随机推荐
- 探索ParNew和CMS垃圾回收器
前言 上篇文章我们一起分析了JVM的垃圾回收机制,了解了新生代的内存模型,老年代的空间分配担保原则,并简单的介绍了几种垃圾回收器.详细内容小伙伴们可以去看一下我的上篇文章:秒懂JVM的垃圾回收机制. ...
- 【抽五分钟】使用VuePress创建在线文档中心
内容目录 安装初始化核心配置导航栏配置侧边栏配置静态资源配置nginx部署typora编写 安装初始化 全局安装 npm install -g vuepress 创建目录 mkdir vurepre ...
- 壹佰文章最全总结| 《关于ASP.NETCore的分享之路》
学习路线图 (关于学习ASP.NET Core需要了解和掌握的知识点图) 一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了,自从春节开始,中间经历种种,慢慢的就开始微信公众号发文了,原因有 ...
- typora的快捷键文档
一:菜单栏 文件:alt+F 编辑:alt+E 段落:alt+P 格式:alt+O 视图:alt+V 主题:alt+T 帮助:alt+H 二:文件 新建:Ctrl+N 新建窗口:Ctrl+Shift+ ...
- MySQL主主模式+Keepalived高可用
今天闲来无事,打算搭建一个MySQL的高可用架构,采用的是MySQL的主主结构,再外加Keepalived,对外统一提供虚IP.先来说说背景吧,现在的项目为了高可用性,都是避免单节点的存在的,比如,我 ...
- 联赛模拟测试25 C. Repulsed 贪心+树形DP
题目描述 分析 考虑自底向上贪心 \(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的多余灭火器 ...
- EXCEL计数时间差--分钟数
- 【Spring Cloud + Vue 有来商城】研发小组开发规范全方位梳理
项目演示 后端 Spring Cloud实战 | 第一篇:Windows搭建Nacos服务 Spring Cloud实战 | 第二篇:Spring Cloud整合Nacos实现注册中心 Spring ...
- Java学习的第四十九天
1.构造函数 import java.util.Scanner; public class Cjava { public static void main(String[]args) { Time t ...
- Jmeter 用户定义的变量的使用
第一步: 打开Jmeter软件,新建一个线程组,添加 > 配置元素 > 用户定义的变量 第二步: 设置值,如下图所示: 第三步,使用设置的名称 :