文章目录
包装类和日期类的讲解
一、包装类
引入
Integer
二、日期相关的类
1、java.util.Date
2、java.sql.Date
3、SimpleDateFormat
4、Calendar
5、JDK1.8新增日期时间API
包装类和日期类的讲解
一、包装类
引入
【1】什么是包装类:
以前定义变量,经常使用基本数据类型
对于基本数据类型来说,它就是一个数,加点属性,加点方法,加点构造器
将基本数据类型对应进行了一个封装,产生了一个新的类,就是包装类
int,byte.....--->基本数据类型
包装类--->引用数据类型
【2】对应关系:
基本数据类型 对应的包装类 继承关系
byte Byte ---》Number---》Object
short Short ---》Number---》Object
int Integer ---》Number---》Object
long Long ---》Number---》Object
float Float ---》Number---》Object
double Double ---》Number---》Object
char Character Object
boolean Boolean Object
【3】已经有基本数据类型了,为什么要封装为包装类?
(1)java语言 面向对象的语言,最擅长的操作各种各样的类。
(2)以前学习装数据的---》数组,int[] String[] double[] Student[]
以后学习的装数据的---》集合,有一个特点,只能装引用数据类型的数据
【4】是不是有了包装类以后就不用基本数据类型了?
不是
Integer
【1】直接使用,无需导包:
【2】类的继承关系:
【3】实现接口:
【4】这个类被final修饰,那么这个类不能有子类,不能被继承:
【5】包装类是对基本数据类型的封装: 对int类型封装产生了Integer
【6】类的历史:
【7】属性:
1.//属性: 2. System.out.println(Integer.MAX_VALUE); 3. System.out.println(Integer.MIN_VALUE); 4. //“物极必反”原理: 5. System.out.println(Integer.MAX_VALUE+1); 6. System.out.println(Integer.MIN_VALUE-1);
【8】构造器(发现没有空参构造器)
(1)int类型作为构造器的参数:
Integer i1 = new Integer(12);
(2)String类型作为构造器的参数:
Integer i2 = new Integer("12"); Integer i3 = new Integer("abcdef");
【9】包装类特有的机制:自动装箱 自动拆箱:
//自动装箱:int--->Integer Integer i = 12; System.out.println(i); //自动拆箱:Integer--->int Integer i2 = new Integer(12); int num = i2; System.out.println(num);
(1)自动装箱 自动拆箱 是从JDK1.5以后新出的特性
(2)自动装箱 自动拆箱 :将基本数据类型和包装类进行快速的类型转换。
验证:
可以自定打断点测试是否走入valueOf方法中:
【10】常用方法:
valueOf方法的底层:
package com.lanson; public class Test04 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //compareTo:只返回三个值:要么是0,-1,1 Integer i1 = new Integer(6); Integer i2 = new Integer(12); System.out.println(i1.compareTo(i2));// return (x < y) ? -1 : ((x == y) ? 0 : 1); //equals:Integer对Object中的equals方法进行了重写,比较的是底层封装的那个value的值。 //Integer对象是通过new关键字创建的对象: Integer i3 = new Integer(12); Integer i4 = new Integer(12); System.out.println(i3 == i4);//false 因为==比较的是两个对象的地址 boolean flag = i3.equals(i4); System.out.println(flag); //Integer对象通过自动装箱来完成: Integer i5 = 130; Integer i6 = 130; System.out.println(i5.equals(i6));//true System.out.println(i5 == i6); //intValue() :作用将Integer--->int Integer i7 = 130; int i = i7.intValue(); System.out.println(i); //parseInt(String s) :String--->int: int i8 = Integer.parseInt("12"); System.out.println(i8); //toString:Integer--->String Integer i10 = 130; System.out.println(i10.toString()); } }
二、日期相关的类
1、java.util.Date
package com.lanson.test02;
import java.util.Date;
public class Test {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//java.util.Date:
Date d = new Date();
System.out.println(d);
System.out.println(d.toString());
System.out.println(d.toGMTString());//过期方法,过时方法,废弃方法。
System.out.println(d.toLocaleString());
System.out.println(d.getYear());//120+1900=2020
System.out.println(d.getMonth());//5 :返回的值在 0 和 11 之间,值 0 表示 1 月。
//返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
System.out.println(d.getTime());//1592055964263
System.out.println(System.currentTimeMillis());
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
System.out.println(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}
package com.lanson.test02; import java.util.Date; public class Test { //这是一个main方法,是程序的入口: public static void main(String[] args) { //java.util.Date: Date d = new Date(); System.out.println(d); System.out.println(d.toString()); System.out.println(d.toGMTString());//过期方法,过时方法,废弃方法。 System.out.println(d.toLocaleString()); System.out.println(d.getYear());//120+1900=2020 System.out.println(d.getMonth());//5 :返回的值在 0 和 11 之间,值 0 表示 1 月。 //返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 System.out.println(d.getTime());//1592055964263 System.out.println(System.currentTimeMillis()); long startTime = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { System.out.println(i); } long endTime = System.currentTimeMillis(); System.out.println(endTime-startTime); } }
2、java.sql.Date
package com.lanson.test02;
import java.sql.Date;
public class Test02 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//java.sql.Date:
Date d = new Date(1592055964263L);
System.out.println(d);
//java.sql.Date和java.util.Date相互转换:
//【1】util--->sql:
java.util.Date date = new Date(1592055964263L);//创建util.Date的对象
//方式1:向下转型
Date date1 = (Date) date;
//方式2:利用构造器
Date date2 = new Date(date.getTime());
//【2】sql-->util:
java.util.Date date3 = d;
//[3]String--->sql.Date:
Date date4 = Date.valueOf("2019-3-8");
}
}
3、SimpleDateFormat
【1】String---》java.util.Date 类型转换:
分解:
(1)String--->java.sql.Date
(2)java.sql.Date--->java.util.Date
public class Test04 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //(1)String--->java.sql.Date java.sql.Date date = java.sql.Date.valueOf("2022-9-24"); //(2)java.sql.Date--->java.util.Date java.util.Date date2 = date; System.out.println(date2.toString()); } }
上面的代码有局限性,字符串的格式只能是年-月-日拼接的形式,换成其它类型,就会出现异常
【2】引入新的类:SimpleDateFormat
package com.lanson.test02; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test05 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //日期转换: //SimpleDateFormat(子类) extends DateFormat(父类是一个抽象类) //格式化的标准已经定义好了: DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //String--->Date try { Date d = df.parse("2019-4-6 12:23:54"); System.out.println(d); } catch (ParseException e) { e.printStackTrace(); } //Date--->String String format = df.format(new Date()); System.out.println(format); Date date = new Date(); System.out.println(date.toString()); System.out.println(date.toGMTString()); System.out.println(date.toLocaleString()); } }
【3】日期格式:
4、Calendar
package com.lanson.test02;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Test06 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//Calendar是一个抽象类,不可以直接创建对象
//GregorianCalendar()子类 extends Calendar(父类是一个抽象类)
Calendar cal = new GregorianCalendar();
Calendar cal2 = Calendar.getInstance();
System.out.println(cal);
//常用的方法:
// get方法,传入参数:Calendar中定义的常量
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
System.out.println(cal.getActualMaximum(Calendar.DATE));//获取当月日期的最大天数
System.out.println(cal.getActualMinimum(Calendar.DATE));//获取当月日期的最小天数
// set方法:可以改变Calendar中的内容
cal.set(Calendar.YEAR,1990);
cal.set(Calendar.MONTH,3);
cal.set(Calendar.DATE,16);
System.out.println(cal);
//String--->Calendar:
//分解:
//String--->java.sql.Date:
java.sql.Date date = java.sql.Date.valueOf("2020-4-5");
//java.sql.Date-->Calendar:
cal.setTime(date);
System.out.println(cal);
}
}
练习
需求:
package com.lanson.test02; import java.util.Calendar; import java.util.Scanner; public class Test08 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //录入日期的String: Scanner sc = new Scanner(System.in); System.out.print("请输入你想要查看的日期:(提示:请按照例如2012-5-6的格式书写)"); String strDate = sc.next(); //String--->Calendar: //String-->Date: java.sql.Date date = java.sql.Date.valueOf(strDate); //Date--->Calendar: Calendar cal = Calendar.getInstance(); cal.setTime(date); //后续操作: //星期提示: System.out.println("日t一t二t三t四t五t六t"); //获取本月的最大天数: int maxDay = cal.getActualMaximum(Calendar.DATE); //获取当前日期中的日: int nowDay = cal.get(Calendar.DATE); //将日期调为本月的1号: cal.set(Calendar.DATE,1); //获取这个一号是本周的第几天: int num = cal.get(Calendar.DAY_OF_WEEK); //前面空出来的天数为: int day = num - 1; //引入一个计数器: int count = 0;//计数器最开始值为0 //在日期前将空格打印出来: for (int i = 1; i <= day; i++) { System.out.print("t"); } //空出来的日子也要放入计数器: count = count + day; //遍历:从1号开始到maxDay号进行遍历: for (int i = 1; i <= maxDay ; i++) { if(i == nowDay){//如果遍历的i和当前日子一样的话,后面多拼一个* System.out.print(i+"*"+"t"); }else{ System.out.print(i+"t"); } count++;//每在控制台输出一个数字,计数器做加1操作 if(count%7 == 0){//当计数器的个数是7的倍数的时候,就换行操作 System.out.println(); } } } }
5、JDK1.8新增日期时间API
引入
JDK1.0中使用java.util.Date类 --》第一批日期时间API
JDK1.1引入Calendar类 --》第二批日期时间API
缺陷:
可变性 : 像日期和时间这样的类应该是不可变的。
偏移性 : Date中 的年份是从1900开始的,而月份都从0开始。
格式化 : 格式化只对Date有用,Calendar则不行。
JDK1.8新增日期时间API --》第三批日期时间API
LocalDate/LocalTime/LocalDateTime
package com.lanson.test02; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; public class Test09 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //1.完成实例化: //方法1:now()--获取当前的日期,时间,日期+时间 LocalDate localDate = LocalDate.now(); System.out.println(localDate); LocalTime localTime = LocalTime.now(); System.out.println(localTime); LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime); //方法2:of()--设置指定的日期,时间,日期+时间 LocalDate of = LocalDate.of(2010, 5, 6); System.out.println(of); LocalTime of1 = LocalTime.of(12, 35, 56); System.out.println(of1); LocalDateTime of2 = LocalDateTime.of(1890, 12, 23, 13, 24, 15); System.out.println(of2); //LocalDate,LocalTime用的不如LocalDateTime多 //下面讲解用LocalDateTime: //一些列常用的get*** System.out.println(localDateTime.getYear());//2022 System.out.println(localDateTime.getMonth());//JUNE System.out.println(localDateTime.getMonthValue());//6 System.out.println(localDateTime.getDayOfMonth());//14 System.out.println(localDateTime.getDayOfWeek());//SUNDAY System.out.println(localDateTime.getHour());//22 System.out.println(localDateTime.getMinute());//22 System.out.println(localDateTime.getSecond());//6 //不是set方法,叫with //体会:不可变性 LocalDateTime localDateTime2 = localDateTime.withMonth(8); System.out.println(localDateTime); System.out.println(localDateTime2); //提供了加减的操作: //加: LocalDateTime localDateTime1 = localDateTime.plusMonths(4); System.out.println(localDateTime); System.out.println(localDateTime1); //减: LocalDateTime localDateTime3 = localDateTime.minusMonths(5); System.out.println(localDateTime); System.out.println(localDateTime3); } }
DateTimeFormatter
package com.lanson.test02; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.time.temporal.TemporalAccessor; public class Test10 { //这是一个main方法,是程序的入口: public static void main(String[] args) { //格式化类:DateTimeFormatter //方式一:预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;IS0_LOCAL_TIME DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME; //df1就可以帮我们完成LocalDateTime和String之间的相互转换: //LocalDateTime-->String: LocalDateTime now = LocalDateTime.now(); String str = df1.format(now); System.out.println(str);//2022-06-15T15:02:51.29 //String--->LocalDateTime TemporalAccessor parse = df1.parse("2022-06-15T15:02:51.29"); System.out.println(parse); //方式二:本地化相关的格式。如: oflocalizedDateTime() //参数:FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT //FormatStyle.LONG :2022年6月15日 下午03时17分13秒 //FormatStyle.MEDIUM: 2022-6-15 15:17:42 //FormatStyle.SHORT:20-6-15 下午3:18 DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); //LocalDateTime-->String: LocalDateTime now1 = LocalDateTime.now(); String str2 = df2.format(now1); System.out.println(str2); //String--->LocalDateTime TemporalAccessor parse1 = df2.parse("20-6-15 下午3:18"); System.out.println(parse1); //方式三: 自定义的格式。如: ofPattern( "yyyy-MM-dd hh:mm:ss") ---》重点,以后常用 DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); //LocalDateTime-->String: LocalDateTime now2 = LocalDateTime.now(); String format = df3.format(now2); System.out.println(format);//2022-06-15 03:22:03 //String--->LocalDateTime TemporalAccessor parse2 = df3.parse("2022-06-15 03:22:03"); System.out.println(parse2); } }
- 博客主页:https://lansonli.blog.csdn.net
- 欢迎点赞 收藏 ⭐留言 如有错误敬请指正!
- 本文由 Lansonli 原创,首发于 CSDN博客
- 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨