java有三种日期类
分别是
第一代日期类
第二代日期类
第三代日期类
第一代日期类
Date类
第一类构造器
Date a=new Date();
System.out.println(a);
输出Tue Jul 19 18:11:37 CST 2022
输出格式是国外的格式,所以我们一般要转换
就要用到SimpleDateFormat类
第二类构造器
Date b=new Date(11533541);//形参为long类型
System.out.println(b);
对应的形参是毫秒数
返回从1970年1月1号加上对应的毫秒数
看图因为System.currentTimeMillis()返回的就是1970.1.1到现在的毫秒数
然后我传这个参数
正好显示是现在的时间
SimpleDateFormat类
创建SimpleDateFormat类对象可以指定相应的格式
格式使用的字母是规定好的
不能乱写
创建完对象,再把对应的Date对象转换为字符串
用到SimpleDateFormat类的format方法
返回值是String
不会对d1数据造成影响
String变Date
常用方法
add(int field,int amount)
加指定字段的指定数值,比如 day 3 就是加三天,无返回值直接在元数据修改
set(int field,int amount)
修改某个字段、
set(int year,int month,int date)
修改对应参数
get(int field) 返回指定字段值
第二代日期类
Canlendar
该类的构造器是protected的
所以只能通过里面的方法
getInstance()来获取实例
应用实例
创建实例
直接输出的话会输出很多字段,看不懂(不是我们想要的格式)
我们可以通过想要的数据进行对应调用
System.out.println(instance.get(Calendar.YEAR));//年
System.out.println(instance.get(Calendar.MONTH)+1);//月,因为月从0开始所以要+1
System.out.println(instance.get(Calendar.DAY_OF_MONTH));//日
System.out.println(instance.get(Calendar.HOUR));//时
System.out.println(instance.get(Calendar.MINUTE));//分
System.out.println(instance.get(Calendar.SECOND));//秒
Calendar没有对应的格式化类
所以需要程序员自己组合输出
第三代日期类
Calendar存在一些问题所以出现了第三代日期类
第三代日期
继承关系
使用
LocalDateTime d=LocalDateTime.now();//年月日时分秒,LocalDate就直是年月日,LocalTime是时分秒
System.out.println(d);
这样的输出还是不太符合我们中国习惯
我们也可以一个个进行输出
System.out.println(d.getYear());
System.out.println(d.getMonth());//输出英文March
System.out.println(d.getMonthValue());//输出数字3
调用对应的get方法即可
第三代日期格式类DateTimeFormatter
类似于SimpleDateFormat
LocalDateTime d=LocalDateTime.now();//年月日时分秒,LocalDate就直是年月日,LocalTime是时分秒
DateTimeFormatter a=DateTimeFormatter.ofPattern("yyyy年和MM月以及dd日mm分钟ss秒");
String str=a.format(d);//返回的对象是格式化的
System.out.println(str);
如何找yyyy是对应的年
看下面的表格,几个字母就对应几个数字
一些方法
其他的方法,可以查看Api使用即可
常用方法
1.getYear/getMonth(获取到的是英文)/getMonthValue(数值)/getDayOfMonth(本月的第几天)
注意getDaysofWeek没有数值的,只有英文类型 比如星期天就是SATURDAY
2.format 配合 DateTimeFormatter
3.isBefore 检查是否在指定日期前,isAfter检查是否在指定日期之后,isEqual检查是否等于指定日期
4.isLeapYear检查是否是闰年
5.plusYears/plusDays…加上指定字段的指定数
minusYears/minusMonths…减去指定字段的指定数
注意plus从second直接到nanosecond就是从秒直接到纳秒
如果你想要加毫秒可以转换一下单位
1s=1000毫秒
可以plus秒除1000
1 毫秒=1000000 纳秒
也可以plus纳秒乘1000000
6.plus方法和minus方法都是以返回值的结果返回的,不会自操作
Instant类(时间戳)
和Date类较为紧密的一个类
Instant a=Instant.now();
System.out.println(a);
也是调用now方法进行一个应用
默认输出格式
2022-07-19T15:58:53.479Z
可以和Date类相互转换
Date d=Date.from(a);
Instant instant = d.toInstant();
Date的静态from(Instant对象)
返回Date对象
通过
Date的toInstant方法转为Instant
LocalDate和LocalTime
LocalDate和LocalTime其实也属于第三日期类
两个组合在一起就是LocalDateTime
LocalDate精度从年到日
而LocalTime精度从日到纳秒
LocalDateTime精度就是从年到纳秒
LocalDateTime可以直接toLocalDate/toLocalTime
转成对应对象
时间间隔和日期间隔
Duration时间间隔
between(日期对象start,日期对象end)返回一个Duration对象
用LocalTimeDate对象即可
返回是end-start的值
可以通过这个对象的方法toSeconds/toMinutes…最高获取toDays
最低toNanos(纳秒)
就是对应了LocalTime或LocalDateTime
Period日期间隔
也是between获取period对象
getDays最低,getYears最高
这个接受参数就只能接受LocalDate喽
注意
duration 计算从start到end的所有时间
经历的天数和秒数的中间的时间都算的
而period只就算其对应最近大于其一个范围内的
比如日对应的就是月(period没有周的概念)
2000年12月10日(start)与2024年2月5日(end)
就隔了26天,从start到end(算start不算end)
2000年离这2024年就是离了23年
1月离2月就是0月!!!
你就理解成end数值-start数值-1就是对应的between