java8日期时间相关

2023-11-05

一. java8时间相关api出现的原因

1. 偏移量问题: 例如通过Date构造器创建指定年份,月份的时间对象时,由于Date对象年份是从1900年开始,月份是从0开始,则需 
	要在构造器中指定时间减去开始时间
2. 格式化问题: 在工作中经常会遇到日期类型数据与字符串的相互转换,只能通过Date,但是java在1.1版本不推荐使用Date,
	推荐Calendar,Calendar中又没有相关转换api
3. Date与Calendar不是线程安全的,不能处理闰秒(闰秒由于地区自转的不均匀性等,世界不同国家在年末时会添加或减去一定的时间
	如果开发的是国际相关软件,需要处理)
4. 为解决以上问题java8吸收了Joda-Time,在java.time包中创建了新的api,
5. 关于本地日期 LocalDate, 本地时间 LocalTime, 本地日期时间 LocalDateTime与时区相关的 ZoneDateTime,持续时间相关的 Duration							类  

在下面的操作中若调用的方法需要传递TemporalAccessor类型参数时,实际就是需要一个LocalDate,或LocalTime,或LocalDateTime,这三个类实现了Temporal接口,而Temporal接口继承了TemporalAccessor接口

在这里插入图片描述

二. LocalDate, LocalTime, LocalDateTime的使用

1. 解释:

通过这几个类可以操作时间日期相关数据,获取,设置,运算等

2. 学习点:

  1. 实例化创建对象的方式,不同方式实例化的对象的特点
  2. 获取时间日期数据的方法
  3. 设置时间日期数据的方法
  4. 加减
  5. 两个时间的间隔计算
  6. 各种类型时间数据相互转换

3. 代码示例

此处大部分以 LocalDateTime 作为示例演示,其他对象也可以调用这些大部分的方法

public class ArrayTest {
    public static void main(String[] args) {
        //1.实例化:
        //方式一: 通过now()静态方法实例化,该方法可以为空参当前时间,可以传递Zoneld对象指定时区
        //实例化LocalDate,LocalTime,LocalDateTime对象 
        LocalDate localDate1 = LocalDate.now();
        LocalTime localTime1 = LocalTime.now();
        LocalDateTime localDateTime1 = LocalDateTime.now();

        //方式二: 通过of()抽象方法创建指定日期时间对象
        //of()为多参数重载方法根据具体需求选择调用,并且在月时分秒设置的不符合规定时间例如
        //月份大于12,时间大于等于24,分秒超过大于等于60时会报错
        LocalDate localDate2 = LocalDate.of(2020,12,4);
        LocalTime localTime2 = LocalTime.of(0,59,59);
        LocalDateTime localDateTime2 = LocalDateTime.of(2020,2,24,15,58,59);
      
        //2.通过对象调用getXxx()方法获取时间
        int m1 = localDateTime2.getMonthValue(); //获取月份
        int m2 = localDateTime2.getDayOfMonth();//获取几号(所在月的第几天)
        Month m3 = localDateTime2.getMonth(); //获取Month对象
        int y1 = localDateTime2.getYear(); //获取年份
        int y2 = localDateTime2.getDayOfYear(); //获取当前年份的第几天
        DayOfWeek dayOfWeek= localDateTime2.getDayOfWeek();
        int w1 = dayOfWeek.getValue();//获取当前时间星期几
        int h = localDateTime2.getHour();//获取小时
        int minute = localDateTime2.getMinute();//获取分
        int se = localDateTime2.getSecond();//获取秒

        //3.通过withXxx()方法设置指定时间(返回新的)
        LocalDateTime localDT = localDateTime1.withYear(2021);//设置年份
        LocalDateTime localDT1 = localDT.withDayOfYear(238);//设置是当前年份的第几天
        LocalDateTime localDT2 = localDT1.withDayOfMonth(3);//设置是第几个月
        LocalDateTime localDT3 = localDT1.withHour(12);//设置时
        LocalDateTime localDT4 = localDT3.withMinute(12);//设置分
        LocalDateTime localDT5 = localDT4.withSecond(59);//设置秒

        //4.通过plusXxx()对当前时间进行累加操作
        LocalDateTime localDT6 = localDT5.plusYears(1);//累加年
        //plusMonths(2);累加月
        //plusWeeks(2);累加周
        //plusDays(2);累加天
        //plusHours(2);累加小时
        //plusMinutes(2);累加分钟
        //plusSeconds(2);累加秒
        //plusNanos(2);累加纳秒

        //5.通过minusXxx()做累减的操作
        LocalDateTime localDT7 = localDT6.minusMonths(2);//减去2个月
        localDT6.minusYears(2);//减去2年..
		
		//6.毫秒数Long与日期时间类型相互转换
		//LocalDateTime转Long
		Long newSecond1 = localDT7.toInstant(ZoneOffset.of("+8")).toEpochMilli();
		//long转LocalDateTime
		LocalDateTime localDateTime = new Date(1535444725000L).toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
		
		//7.将Long毫秒数先转换为 Instant 类型,然后将Instant转换为 LocalDateTime
		Instant instant = Instant.ofEpochMilli(1535444725000L);
        LocalDateTime lot = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        
		//8.Date与LocalXxxXxx间的相互转换
		Date date = Date.from(localDT7.atZone(ZoneId.systemDefault()).toInstant());
		LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault());
    }
}  

三. Instant

1. 解释

1) 对于程序而言需要用到的时间类型通常为毫秒数,java8提供了Instant,
2) 时间线上的瞬时点,记录应用程序中的时间戳,通过这个对象可以获取到指定时间的毫秒数,纳秒数等数据
3) 注意获取Instant示例时时区问题,

2. 学习点

1) 实例化方式,不同方式的特点
2) 获取时间戳,也就是毫秒数
3) 注意时区问题
4) Instant对象与Long类型毫秒数的相互转换

3. 代码示例

 		//1.实例化Instant
        //通过now()静态方法进行实例化,注意默认返回的是utc时区的
        //由于获取的时间是utc时区的,中国需要加8个小时后才是当前时间
        Instant instant1 = Instant.now();

        //2.通过Instant实例对象调用,atOffset(ZoneOffset)方法设置时区,修改为当前时间
        //该方法中传递一个ZoneOffset,8为中国时区
        OffsetDateTime offsetDateTime = instant1.atOffset(ZoneOffset.ofHours(8));
        System.out.println( offsetDateTime );//此时返回的OffsetDateTime为正确的时间

        //3.获取毫秒数时间戳(距离1970-01-1 00:00:00到Instant所代表时间的毫秒数)
        long milli = instant1.toEpochMilli();

        //4.通过long类型毫秒数获取Instant实例
        long l = 1550475314878L;
        Instant instant2 = Instant.ofEpochMilli(l);
        System.out.println( instant2 );

四. DateTimeFormatter 日期格式化类

1. 解释:

1) 在工作中通常会碰到前台向后台传递的日期类型数据一个字符串,或者前台需要的日期数据为字符串类型有固定格式,
	此时就需要将日期类型转换为字符串类型
2) 在开发时按照预定义格式,或自定义格式使用 DateTimeFormatter,对时间类型数据与字符串进行相互转换
3) 预定义格式 ISO_LOCAL_DATE_TIME, ISO_LOCAL_DATE, ISO_LOCAL_TIME
4) 本地化相关格式 如: ofLocalizedDateTime(FormatStyle.LONG)
4) 自定义格式 如: ofPattern("yyyy-MM-dd HH:mm:ss E")

2. 学习点

1) 获取指定字符串格式的 DateTimeFormatter 实例对象的方式
2) 格式化日期时间对象,返回字符串
3) 将代表日期时间的字符串格式化为日期时间类型

3. 代码示例

		 //1.实例化对象(实例化对象可以看为获取对象并设置指定的转换格式)

        //方式一: 自定义格式化 (E代表中文的星期几)
        String s = "yyyy-MM-dd HH:mm:ss E";
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern(s);

        //方式二: 本地化格式实例化
        //本地化常量(括号中是该常量转换后的样式): LONG(2020年2月23日 下午08时35分59秒),
        //MEDIUM(2020-2-23 20:36:28), SHORT(20-2-23 下午8:37)
        //FULL 用于ofLocalizedDate()方法
        DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        
        //方式三: 预定义格式实例化,通过DateTimeFormatter调用预定义的常量
        //预定义常量(括号中是该常量转换后的样式): ISO_LOCAL_DATE_TIME(2020-02-23T20:38:20.265),
        //ISO_LOCAL_DATE(2020-02-23), ISO_LOCAL_TIME(20:39:10.022)
        DateTimeFormatter formatter3 = DateTimeFormatter.ISO_LOCAL_TIME;

        //2.将日期对象转换为日期字符串
        //获取时间对象
        LocalDateTime time = LocalDateTime.now();
        //通过 DateTimeFormatter 示例对象调用 format() 方法
        //按照创建 DateTimeFormatter 对象时指定的格式转换为字符串
        String dateTimeStr1 = formatter1.format(time);
        System.out.println(dateTimeStr1);


        //3.将字符串转换为日期格式对象,字符串要与实例化DateTimeFormatter对象时的格式一一对应
        String dateStr = "2020-02-23 09:22:39 星期日";//(上面带E,此处字符串要带星期几)
        //使用DateTimeFormatter实例对象调用parse()方法将字符串转换为TemporalAccessor
        TemporalAccessor t = formatter1.parse(dateStr);
        //使用LocalDateTime,日期时间对象调用parse("时间字符串",DateTimeFormatter)
        //方法将字符串转换为指定的日期时间对象
        LocalDateTime dateTime = LocalDateTime.parse(dateStr,formatter1); 

五. 时间间隔计算

1. 解释:

在某些时候会计算两个时间的间隔,或两个时间的大小
1) 计算两个时间的时分秒间隔使用 Duration
2) 计算两个时间的年月日间隔使用 Period
3) 判断两个时间的先后顺序

2. 示例

计算两个时间间隔的年月日
		//开始时间,前面的时间
        LocalDate startDate = LocalDate.of(1993, Month.OCTOBER, 19);
        //结束时间,后面的时间
        LocalDate endDate = LocalDate.now();

        //计算: 通过Period调用 between(前面的时间对象,后面的时间对象) 方法计算
        //返回 Period 实例,两个日期的间隔数据保存在该实例中
        //(若不知道两个时间的前后顺序,后面再获取间隔数据时可以通过Math.abs()取绝对值)
        Period p = Period.between(startDate, endDate);

        System.out.printf("间隔 %d 年 %d 个月 %d 日", p.getYears(), p.getMonths(), p.getDays());
计算两个时间的间隔包括时分秒
		//开始时间,前面的时间
        LocalDateTime startDateTime = LocalDateTime.of(2019,4,24,15,58,59);
        //结束时间,后面的时间
        LocalDateTime endDateTime = LocalDateTime.now();
        //通过 Duration 调用 between(前面的时间, 后面的时间) 方法计算间隔
        //返回 Duration 实例对象,间隔数据保存在这个对象中
        Duration duration = Duration.between(startDateTime,endDateTime);
        System.out.println(duration);
        long days = duration.toDays(); //相差的天数
        long hours = duration.toHours();//相差的小时数
        long minutes = duration.toMinutes();//相差的分钟数
        long millis = duration.toMillis();//相差毫秒数
        long nanos = duration.toNanos();//相差的纳秒数
        System.out.println(nanos);
判断两个时间的先后顺序
		String time1 = "2019-06-26 19:00:00";
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse(time1, dtf2);
		boolean b1 = localDateTime.isBefore(LocalDateTime.now());//你的时间在当前时间之前是true
    	boolean b2 = localDateTime.isAfter(LocalDateTime.now());//在当前时间之后是false

六. java8其它时间相关操作

1. 其它api

在这里插入图片描述

1) zoneId , ZoneDateTime 时区相关

在这里插入图片描述

2) TemporalAdjuster(TemporalAdjusters)时间校正器

在这里插入图片描述

2. java8与传统时间相关数据的转换

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8日期时间相关 的相关文章

随机推荐

  • OpenGL error 0x0502

    项目出现OpenGL error 0x0502 导致有些UI绘制不出来 大致情况是这样 游戏切换到后台之后 其他玩家发来语音 在语音还在播放的时候 切换回前台 这个时候语音服务器 用的融云 会推送到安卓底层 安卓底层有回调到cocos2dx
  • Linux系统之neofetch工具的基本使用

    Linux系统之neofetch工具的基本使用 一 neofetch工具介绍 1 1 neofetch简介 1 2 neofetch特点 二 检查本地环境 2 1 检查操作系统版本 2 2 检查内核版本 三 安装neofetch工具 3 1
  • VMware Workstation Pro 安装教程

    文章目录 笔者的运行环境 VMware Workstation 16 Pro Red Hat Enterprise Linux 8 3 0 需要提前一个操作系统的镜像文件 ISO 这个文件与 VMware 无关 实际上 在安装完 VMwar
  • 生成字典的三种方式

    字典是记录一些特殊或有目的性的密码集合 通常以txt格式进行记录保存 在渗透许多服务器 smb ftp ssh 远程桌面rdp 网页后台等一些用户登录时 没有正确密码 使用密码字典爆破就是最直接的黑客攻击方法 一 使用cupp工具生成 1
  • 对输入数据排序后进行二分查找(C语言)

    输入数据后的排序方法有很多种 这里我用的是暴力排序 各位友友们可以尝试更改排序方法 include
  • Python selenium 滚动页面以及滚动至元素可见之详细讲解

    我们滚动浏览器页面向上 下 左右可以用一下代码 向上和向左需要加 向下滚动xx个像素 driver execute script window scrollBy 0 xx 向上滚动x个像素 driver execute script win
  • JM解码(一):参考帧列表和DPB处理

    以P帧为例 void alloc ref pic list reordering buffer Slice currSlice int size currSlice gt num ref idx active LIST 0 1 if cur
  • 谷粒商城-分布式高级篇[商城业务-订单服务]

    谷粒商城 分布式基础篇 环境准备 谷粒商城 分布式基础 业务编写 谷粒商城 分布式高级篇 业务编写 持续更新 谷粒商城 分布式高级篇 ElasticSearch 谷粒商城 分布式高级篇 分布式锁与缓存 项目托管于gitee 一 页面环境搭建
  • ubuntu freeradius 3.0 + mariadb

    安装数据库及Radius sudo apt update sudo apt install y freeradius freeradius mysql freeradius utils mariadb server mariadb clie
  • Unity Rotate鼠标控制人物旋转

    添加碰撞盒 一定要添加碰撞盒才能响应鼠标事件 将碰撞盒复制给骨架 如果鼠标划动的向量 X轴大于Y轴 则是左右划动 让它旋转 SpinWithMouse using System Collections using System Collec
  • 窗体,组件,事件

    窗体对象JFrame package frame import javax swing public class JFrameTest public static void main String args 创建窗体对象 JFrame jF
  • 使用javacv中的ffmpeg实现录屏,结果连运行都失败了,现在终于解决了

    前言 今天突发奇想 想自己写一个录屏的软件 上次写了一个专门录音的Demo 但是要把声音和视频放到一起合成一个mp4文件 着实有一点艰难 所以就打算使用ffmpeg来写一个 而这篇博客中会顺便谈一谈我碰到的各种坑 ffmpeg是一个c 程序
  • 中兴EPON OLT-C300开局配置

    一 基础配置 1 自定义时间 clock set hh mm ss Apr 8 2018 con t username zte password zte privilege 15 用户名密码 2 自定义名称 hostname CeShi O
  • js如何进行数组去重?

    1 数组反转 使用 reverse 实现数组反转 const arr 1 2 3 console log arr 1 2 3 arr reverse console log arr 3 2 1 2 数组去重 1 new Set array
  • python学习语法中与c语言不同之处(1)

    一 发现使用打印使用的是print 而在C语言中我们更多的使用的是printf 比如想要打印出来hello world 直接如下 C语言 printf a d a python语言 print hello world 然后就是直接回车键就可
  • angular表单验证

    表单验证 通常 我们都需要对用户的表单输入做验证 以保证数据的整体质量 Angular也有两种验证表单的形式 使用属性验证 用于模板驱动表单 使用验证器函数进行验证 用于响应式表单 验证器 Validator 函数 验证器函数可以是同步函数
  • 13功能之C++类默认生成的六个成员函数的自定义

    13功能之C 类默认生成的六个成员函数的自定义 1 代码理解即可 pragma warning disable 4996 include
  • UGUI之rectTransform属性

    RectTransform 本文转载自uGUI知识点剖析之RectTransform 一 基本要点 RectTransform继承于Transform 在 Transform 基础上 RectTransform 增加了 轴心 pivot 锚
  • 【文献翻译】构建网络安全知识库的框架-A Framework to Construct Knowledge Base for Cyber Security

    摘要 现在有一些针对不同方面的独立网络安全知识库 在互联网上 也有很多网络安全相关的内容以文字的形式存在 融合这些网络安全相关信息可以是一项有意义的工作 在本文中 我们提出了一个框架来整合现有的网络安全知识库并从文本中提取网络安全相关信息
  • java8日期时间相关

    java8时间相关api 一 java8时间相关api出现的原因 二 LocalDate LocalTime LocalDateTime的使用 1 解释 2 学习点 3 代码示例 三 Instant 1 解释 2 学习点 3 代码示例 四