以前操作时间都是使用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;
}

  

calendar是共享变量,并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象调用format方法时,多个线程会同时调用calendar.setTime方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。

所以JAVA8推出了LocalDate、LocalTime、LocalDateTime是线程安全、简易、高可靠的时间包。源码如下

  1. 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);
    }

      

  2. 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);
    }

      

  3. 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); }

      

  4. 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);
    }

      

  5. 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);
    }

      

  6. 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); }

      

java8新特性LocalDate、LocalTime、LocalDateTime的学习的更多相关文章

  1. Java8 新特性学习

    摘自:https://blog.csdn.net/shuaicihai/article/details/72615495 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda ...

  2. 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)

    1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...

  3. java8新特性学习:函数式接口

    本文概要 什么是函数式接口? 如何定义函数式接口? 常用的函数式接口 函数式接口语法注意事项 总结 1. 什么是函数式接口? 函数式接口其实本质上还是一个接口,但是它是一种特殊的接口:SAM类型的接口 ...

  4. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  5. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  6. 干货 | Java8 新特性教程

    本教程翻译整理自 https://github.com/winterbe/java8-tutorial 本教程首发自个人网站: https://www.exception.site/java8/jav ...

  7. java8 新特性精心整理(全)

    前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...

  8. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  9. Java8 新特性(三) - 日期时间对象以及一些其他特性

    日期时间对象 关于日期时间的操作可以分为两种: 转换:与字符串的互相转换,与时间戳的互相转换 计算:计算两个时间点之间的间隔.时间点与时间段的计算(计算下周N.下个月D日.去年M月D日等等) Java ...

随机推荐

  1. 小C和小派的缠绵爱情——C语言调用Python代码

    我妒忌你的开源,你眼红我的速度,不如我们就在一起吧! --------SJ2050 2019.4.9号更新:实现在未安装python环境的机子上运行调用了python程序的C语言代码! 文章目录 环境 ...

  2. C#Socket通讯(2)

    前言 前面已经把游戏的服务端UI搭起来来了,现在需要实现的就是编写服务端控制器与客户端的代码,实现服务端与客户端的数据传输,并将传输情况显示在服务端的UI上 服务端控制器完整代码 private st ...

  3. Vue中封装axios组件实例

    首先要创建一个网络模块network文件夹  里面要写封装好的几个组件 在config.js里面这样写 在index.js要这样写 core.js文件里面内容如下 然后要在main.js文件里面要设置 ...

  4. git删除缓存区中文件

    删除缓冲区中的文件 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除: git rm --f "文件路径",不仅将该文件从缓 ...

  5. Spring+Hibernate+Struts2整合之实现登录功能

    前端代码: <form id="loginForm" action="${ pageContext.request.contextPath }/user_login ...

  6. Python基础知识,新手入门看过来

    1 下载和安装Python 在开始编程之前,你需要安装Python解析器软件(这里你可能需要找人帮忙).解析器是一个可以理解你用Python语言写的指令的程序.如果没有解析器,你的计算机不会理解这些指 ...

  7. 最全Python基础知识点梳理

    本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象,也算是对于学习这门语言的一个总结与回顾.python的详细语法介绍可以查看官方编程手册,也有一些在线网站可以学习 python语言 ...

  8. (CS229)监督学习应用和梯度下降

    监督学习:基于标记数据的学习 监督学习又举了两个例子:回归问题regression在连续数据上的模型构建问题  和 分类问题 classification 在离散数据上的问题 无监督学习:未标记的学习 ...

  9. Luogu P4643 阿狸和桃子的游戏

    题解 传送门 既然题目要求的是差值 所以对于减数和被减数同时加上一个相同的数是毫无影响的 (详情参考人教版六年级上册数学教材) 所以不妨把边权分成两半 分别加给两个顶点 然后,直接每次选最大的点就好了 ...

  10. NB-IOT覆盖范围有多大 NB-IOT的强覆盖是怎么实现的

    NB-IoT技术自出现以来就以其强大的覆盖范围和通讯距离长而受到广泛的欢迎,发展到现在已经成为万物互联网络中的一个重要分支.那么NB-IoT覆盖范围到底有多大,是怎么来衡量其覆盖能力? 强大的覆盖范围 ...