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 2023
            System.out.println(date);
            //Thu Jan 01 08:00:01 CST 1970
            System.out.println(date1);
    
  2. 实例化date后,可以调用date的getTime方法,获取long类型的毫秒数

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

    	//设置当前时间
        date.setTime(time1);
        date1.setTime(time);
    
        System.out.println(date.getTime());//1000
        System.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使用的是默认格式,有参就是用的是参数的格式。

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

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

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

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

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

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

       		//实例化Calendar
      		Calendar 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.精确到纳秒

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…

DNS服务器典型配置

文章目录 安装主程序bind和安全插件bind-root修改主配置文件/etc/named.conf正向解析 安装主程序bind和安全插件bind-root yum install bind-chroot修改主配置文件/etc/named.conf vim /etc/named.conf将listen-on和allow-query的ip或域名换成any 表示为服务器所有的IP地址启…

多svn仓库一键更新脚本分享

之前分享过多git仓库一键更新脚本,本期就分享下svn仓库的一键更新脚本 1、首先需要设置svn为可执行命令行 打开SVN安装程序,选择modify,然后点击 command client tools,安装命令行工具 2、update脚本 echo 开始更新SVN目录&…

【Android 标题文字居中 快速实现】

背景: Android App系统默认setTitle左起展示(图左),IOS App默认居中展示(图右)。现在美工设计 在Android中标题同样居中显示。 解决: 方案一:(传统方式,比较繁琐) 设置ToolBar样式,内嵌TextView来展示,具…

网络安全准入技术之MAC VLAN

网络准入控制作为主要保障企业网络基础设施的安全的措施,特别是对于中大型企业来说,终端类型多样数量激增、终端管理任务重难度大、成本高。 在这样的一个大背景下,拥有更灵活的动态识别、认证、访问控制等成为了企业网络安全的最核心诉求之…

保姆级教程——pytest【入门篇】

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

【libGDX】初识libGDX

1 前言 libGDX 是一个开源且跨平台的 Java 游戏开发框架,于 2010 年 3 月 11 日推出 0.1 版本,它通过 OpenGL ES 2.0/3.0 渲染图像,支持 Windows、Linux、macOS、Android、iOS、Web 等平台,提供了统一的 API,用户只需要…

数据结构—LinkedList与链表

目录 一、链表 1. 链表的概念及结构 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 二.LinkedList的使用 1.LinkedList概念及结构 2. LinkedList的构造 3. LinkedList的方法 三. ArrayList和LinkedList的区别 一、链表 1. 链表的概念及结构 链表是一种 物理…

开启创造力之门:掌握Vue中Slot插槽的使用技巧与灵感

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、s…

【Ubuntu】设置永不息屏与安装 dconf-editor

方式一、GUI界面进行设置 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal打开 Ubuntu 桌面环境的设置菜单。你可以通过点击屏幕右上角的系统菜单,然后选择设置。在设置菜单中,…

弱类型和强类型自定义UDAF函数

目录 使用自带的avg函数弱类型自定义UDAF函数(AVG)强类型自定义UDAF函数(AVG) 弱类型:3.x过期 2.x有 强类型:3.x 2.x没有 使用自带的avg函数 import org.apache.spark.rdd.RDD import org.apache.spark.sql.{DataFrame, SparkSession}object UserDefine…

GD32_ADC采样+DMA多通道扫描传输

GD32_ADC采样DMA多通道扫描传输 文章目录 GD32_ADC采样DMA多通道扫描传输前言一、资源介绍二、原理1.ADC连续扫描模式2.DMA传输3.ADC内部通道 三、配置1.ADC配置2.DMA配置3.注意事项 四、计算1.分压转换2.数据转换 前言 <1>、硬件平台&#xff1a;可运行软件程序的GD32单…

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析B

STEMA考试-计算思维-U8级(样题) 1.浩浩的左⼿边是&#xff08; &#xff09;。 A.兰兰 B.⻉⻉ C.⻘⻘ D.浩浩 2.2时30分&#xff0c;钟⾯上时针和分针形成的⻆是什么⻆&#xff1f;&#xff08; &#xff09; A.钝⻆ B.锐⻆ C.直⻆ D.平⻆ 3.下⾯是⼀年级同学最喜欢的《⻄游记》…

人工智能基础_机器学习037_多项式回归升维实战4_使用随机梯度下降模型_对天猫双十一销量数据进行预测_拟合---人工智能工作笔记0077

上一节我们使用线性回归模型最终拟合了双十一天猫销量数据,升维后的数据. 我们使用SGDRegressor的时候,随机梯度下降的时候,发现有问题, 对吧,怎么都不能拟合我们看看怎么回事现在 可以看到上面是之前的代码 上面是对数据的准备 这里我们还是修改,使用 poly=PolynomialFeatur…

nodejs+vue电影在线预定与管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将电影在线预定与管理系统功能模块主要分为管理员模块。 我国各行各业的发展在信息化浪潮的推动下也在不断进步&#xff0c;尤其是电影产业&#xff0c;在人们生活水平提高的同时&#xff0c;从…

旅拍摄影技巧澳大利亚、韩国旅行攻略

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 刚刚在腾讯内部做了一场摄影分享课&#xff1a; 《旅拍摄影技巧&澳大利亚、韩国旅行攻略》 分享了早前去两个国家的一些旅行见闻和摄影心得。我发现&#xff1a;把自己学会的东西整理出来&#xff0c;再告诉给别人这件…

探索人工智能领域——每日30个名词详解【day3】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

c语言从入门到实战——数组指针与函数指针

数组指针与函数指针 前言1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化? 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移…

【华为HCIP | 华为数通工程师】ISIS 高频题(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

机器人导航+OPENCV透视变换示例代码

透视变换又称四点变换&#xff0c;所以不能用于5边形这样的图形变换&#xff0c;不是真正的透视变换&#xff0c;但是这个方法可以把机器人看到的图像转换为俯视图&#xff0c;这样就可以建立地图&#xff0c;要不然怎么建立地图呢。 void CrelaxMyFriendDlg::OnBnClickedOk()…