java时间类

一、java时间类为什么这么复杂?

java的时间类非常复杂,这是由于jdk1.0到jdk1.1的时间类设计存在缺陷,导致使用不方便,线程不安全等问题,所以在jdk1.8,java又重新加入了一些时间类替换之前的时间类,但是jdk1.8为了兼容已经使用了老版本时间类的项目,并没有将老版时间类移除,只是将其中大部分方法标注为过时的,不推荐使用。
老版时间类这里主要介绍:

  • java.util.Date;
  • java.text.SimpleDateFormat,;
  • java.util.Calendar;

新版本的时间类主要介绍:

  • java.time.LocalDate;
  • java.time.LocalTime;
  • java.time.LocalDateTime;
  • java.time.ZoneId;
  • java.time.ZonedDateTime;
  • java.time.instant;
二、老版本的时间类

既然已经过时为什么还要学习这些老版时间类?

这是因为还有大量的老项目中可能使用这些时间类,为了在碰见这些老项目时不至于两眼抓瞎,还是需要了解一下这些老版时间类。

  • java.util.date
    date类通过获取从1970年1月1日 00:00:00至今的毫秒数来记录时间,这个毫秒值用long类型的值来保存。
  1. 实例化date类的方法有两种:

    		//获取当前时间Date date = new Date();//通过long类型的值来实例化long time=1000l;Date date1 = new Date(time);//结果:Wed Nov 15 12:01:17 CST 2023System.out.println(date);//Thu Jan 01 08:00:01 CST 1970System.out.println(date1);
    
  2. 实例化date后,可以调用date的getTime方法,获取long类型的毫秒数

    		//获取当前毫秒数long time = date.getTime();//Wed Nov 15 12:01:17 CST 2023long time1 = date1.getTime();//Thu Jan 01 08:00:01 CST 1970//1700021140846System.out.println(time);//1000System.out.println(time1);
    
  3. date的值可以被修改,使用setTime方法

    	//设置当前时间date.setTime(time1);date1.setTime(time);System.out.println(date.getTime());//1000System.out.println(date1.getTime());//1700023634184
    

    这也是date被人诟病的地方,date存储的时间可以被改变,一旦被改变原数据就找不回来了。

Date类型虽然存储了时间,但是输出形式只有long的毫秒数和固定的格式(Wed Nov 15 12:01:17 CST 2023),为了满足不同格式的输出,就有SimpleDateFormat类来将Date以预设的格式输出成字符串。

  • java.util.SimpleDateFormat

    1. SimpleDateFormat的实例化也有两种形式,无参实例化和将格式字符串传入后实例化。
      无参实例化出的SimpleDateFormat使用的是默认格式,有参就是用的是参数的格式。

      		//实例化SimpleDateFormatSimpleDateFormat simpleDateFormat = new SimpleDateFormat();//默认格式的字符串 yyyy/MM/dd 上/下午hh:mmSimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      
    2. SimpleDateFormat是如何识别参数格式的呢?
      在这里插入图片描述
      第一列字母就是SimpleDateFormat能识别的关键字符,常用的y表示年,M表示月份,m表示分,H表示小时,s表示秒,d表示月份的天数。
      SimpleDateFormat在格式化输出时,会将格式参数中能识别的关键字符替换成相应的日期,不能识别的就原封不动。

    3. SimpleDateFormat将date格式化输出的方法是format()方法,参数是date对象

      		//实例化SimpleDateFormatSimpleDateFormat simpleDateFormat = new SimpleDateFormat();//默认格式的字符串 yyyy/MM/dd 上/下午hh:mmSimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化输出String s = simpleDateFormat.format(date1);System.out.println(s);//23-11-15 下午12:47s = simpleDateFormat1.format(date1);System.out.println(s);//2023-11-15 12:48:46
      
    4. SimpleDateFormat还能将格式化的时间字符串创建为一个date变量,使用parse()方法,参数就是字符串时间。 SimpleDateFormat的格式必须和字符串时间的格式一样。

      		//将格式化字符串时间还原成dateString str = "2023-11-15 12:48:46";Date date2 = simpleDateFormat1.parse(str);
      
    5. SimpleDateTime是线程不安全的,多个线程同时使用一个SimpleDateTime解析格式会发生问题。

  • java.util.Calendar
    Calendar内部维护了很多字段,从起点至今的秒数,时区,年月日分秒,周数,天数等都是通过字段来维护的。
    在这里插入图片描述

    1. Calendar是一个接口,它的不能直接实例化。
      实例化之后Calendar对象获取的实例化时的瞬时时间。

       		//实例化CalendarCalendar calendar = Calendar.getInstance();
      
    2. 获取某个字段的信息,使用get()方法,int值(Calendar内部维护了表示所有字段的静态变量)

      		//获取内部字段值int year = calendar.get(Calendar.YEAR);
      

      这也显示了Calendar使用不便的地方,获取字段一般都是get字段名()方法来获取某一个字段,但是Calendar只有一个get()方法,需要传入不同的参数来获取不同的字段,这些参数又不好记,使用起来非常不便。

    3. Calendar也可以被修改,set()方法第一个参数是静态变量值,第二个是修改后的值。

      //修改内部字段值calendar.set(Calendar.YEAR,2010);//将年份修改为2010年
      

总结:为什么calendar,date,simpleDateFormat被淘汰了
1.设计不合理使用不方便
2.可变的,修改之后会丢失原本信息
3.可被修改,又没有线程安全机制,所以是线程不安全的
4.只能精确到毫秒

三、新版本的时间类

在这里插入图片描述

  1. 用来代替Calendar的时间类
    • java.time.LocalDate
    • java.time.LocalTime
    • java.time.LocalDateTime
      获取三个时间类的方法
      在这里插入图片描述
      三者的使用方法风格都差不多
      获取参数就是用get~
      修改日期就是用with~
      加日期就是plus~
      减日期就是minus~
      获取指定日期的对象就调用静态方法of~
      判断相等,在前,在后equal,isbefore,isafter
    • java.time.ZoneId
    • java.time.ZoneDateTime
      在这里插入图片描述
      ZoneId就用用来管理时区的,用获取默认时区也就是当前系统时区(systemDefault),还能获取指定时区用of(时区字符串)
      Zonedatetime就是用来获取时区时间的,它的方法和localDatetime几乎相同,不同的是可以根据时区来实例化,以此来获取对应时区的时间
      Zoneid和zonedatetime配合使用
    • java.time.Instant
      instant获取当前的时间戳(代替date)
      通过instant对象到的时间由两部分组成,总秒数+不够一秒的纳秒数
      在这里插入图片描述
      Instant能获取纳秒但是localdatetime也能获取纳秒,为啥还要用instant?
      Instant有一个获取从1970 -01-01 00:00:00到现在的秒数的方法,localdatetime中只有获取这一分钟内秒数的方法。
  • java.time.DateTimeFormatter
    在这里插入图片描述
    DatetiemForMatter使用方法:
    1.创建格式化器;DatetiemForMatter静态方法ofPattern创建了格式化器,传入字符串参数作为格式
    2.将时间对象格式化成字符串;使用format方法来将传入的时间对象格式化成字符串。
    3.时间对象也可以调用本身的format方法并传入时间格式器对象来生成格式化后的时间字符串。
    4.将格式字符串转换成时间对象;时间类调用静态parse方法传入字符串和格式化器创建时间对象。

总结:jdk1.8引入的时间类的优势:
1.设计更合理,使用方便
2.不可变的,要修改的话,会直接创建一个新的对象返回,不会修改原本对象
3.线程安全的,有线程安全机制
4.精确到纳秒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/180070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 单用户模式修改密码 3步搞定 666 (百分比成功)

1.第一步重新服务器 2.进入这个页面按e进入单用户模式 3.找到linux16这行 在后面添加 init/bin/bash 按ctrlx进入 4.注意是事项直接修改是报错passud: Authentication token manipulation error 需要执行权限:mount -o remount,rw /

SpringBoot Web开发

SpringBoot3-Web开发 SpringBoot的Web开发能力,由SpringMVC提供。 Web开发的三种方式 方式处理过程注意事项实现效果全自动直接编写控制逻辑全部使用自动给配置默认效果手自一体Configuration、 配置WebMvcConfigurer、 配置WebMvcRegistrations不要标注 EnableWeb…

macos死机后IDEA打不开,Cannot connect to already running IDE instance.

Cannot connect to already running IDE instance. Exception: Process 573 is still running 解决办法 进入:/Users/lzq/Library/Application Support/JetBrains 找到IDEA的目录删除隐藏文件夹 .lock rm -rf .lock

邮件钓鱼-邮件来源伪造-SPF绕过-setoolkitgohishswaks钓鱼

0x00 SPF简介 SPF即发送方策略框架,某种邮件服务器会有自己的SPF策略设定,可以设定SPF为只允许某些主机发送邮件等,当设定后第三方就无法伪造成邮件服务器的管理员对用户下发邮件。 是否存在SPF的验证: linux下:dig…

tomcat8.5.95配置https报错 socket ,无法包装数据,状态无效[CLOSED] ,断开的管道

tomcat8.5.95配置https一直下面的错,经过一下午的排查解决了 2023-11-15 16:33:16.825 ERROR[https-jsse-nio2-8183-exec-5]org.springframework.boot.web.support.ErrorPageFilter.handleCommittedResponse:213 -Cannot forward to error page for request [/css/bootstrap.m…

windows 电脑删除不了.TTF的文件

出现这个问题,首先检查,你的.ttf文件是不是在哪个软件中打开了。 如果是,先关掉,然后在删一遍试试。 如果这个还是不行试着打开控制面板>外观和个性化> 字体 > 字体设置>还原默认字体设置勾选,然后重启一下…

从房地产先后跨界通信、文旅演艺领域,万通发展未来路在何方?

近年来,房地产市场可谓负重前行,各大房企纷纷谋求新出路。 作为中国最早的房企之一,万通发展再次处在转型变革的十字路口。自去年以来,万通发展在转型升级之路上动作频频,可谓忙得不亦乐乎。 大幕落下之时,…

《Linux从练气到飞升》No.27 Linux中的线程互斥

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

Unity如何保存场景,如何导出工程文件/如何查看保存位置?【各版本通用】

如何保存场景? 在unity中CtrlS 或者File—>Save 输入你要保存的场景名【建议保存在Scenes文件夹下】 下图,保存场景不在Scenes文件夹下: 下图,保存在Scenes文件夹下: 下图,保存完成 如何导出工程文…

浅了解下:运营商大数据如何挖掘电销同行网站,APP,精准获客 ?

今天我们要讲的是运营商精准大数据营销。运营商精准大数据营销只是精准营销的一种,精准营销筛选包含了电话营销这个词。那么电话营销如何通过运营商大数据找到精准的客户?电销如何通过大数据找到准确的客户来源? 在全网时代,大数…

DeCLIP 论文阅读

DeCLIP:supervision exists everywhere:a data efficient contrastive language-image pre-training paradigm 贡献: 论文是为了充分利用单模态和多模态,充分利用单模态特征用自监督(SIMSAM和MLM),多模态用图像文本对…

修改ubuntu终端目录背景颜色

Ubuntu终端上有部分目录是黄绿色底色,看着很不舒服。如下图所示: 这是由于修改用户权限导致的问题。 通过下面指令可以看到 echo $LS_COLORS | grep "ow" ​ 可以看到ow的默认参数是34:42ow:OTHER_WRITABLE,即其他用户可写权限 …