java基础笔记 常用类2 时间类


2. 日期相关的类

? JDK8之前的类

2.1java.lang.System类

? System.currentTimeMillis(); // 1970年开年开始到现在的时间差(毫秒为单位)

? 可以称为时间戳

2.2Date类

2.2.1 java.util.Date

? 他还是个父亲

  • ? 俩构造器

? Date();当前时间的

? Date(long date);//实际就是相差的毫秒数

  • 常用方法

? toString()方法的重写

? 返回当前: 星期 月 日 时:分:秒 时区 年

? getTime(); 返回 1970年开年开始到现在的时间差(毫秒为单位)

2.2.2 java.sql.Date类

? 父子类关系,这个是子类

? 用于处理数据库中的时间数据类型

  • ? 构造器

Date(long date);//同上

2.2.3 父转子:

Date date=new Date();//util的
sql.Date date2 = (java.util.Date)date;//不报错,但是肯定会异常
sql.Date date3 = new Date(date.getTime());

2.3 SimpleDateFormat类 (非静态)

格式化 解析日期类,就是把日期--->文本

a. 格式化 将日期转化成指定格式的字符串

b. 解析 逆过程

SimpleDateFormat sdf = new SimpleDateFormat();
        Date date = new Date();
        //格式化
        String format = sdf.format(date);
        System.out.println(format);// 2021/12/1 下午8:58  这就是默认的格式

 		//解析:
        String str="2021-11-02";
        try { //为啥try,因为怕你写的字符串不靠谱
            Date parse = sdf.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //解析,parse的时候不想用默认格式,就需要再创建类的时候使用参数
        //这也是为啥这么大个工具类却不是静态的原因
        SimpleDateFormat sdf1=new  SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(sdf1.format(date));
        String str2="2020-11-11 09:09:15";
        try {
            Date parse1=sdf1.parse(str2);
            System.out.println(parse1);

        } catch (ParseException e) {
            e.printStackTrace();
        }

2.4 Calendar 日历类

这是个抽象类

所以要么创建子类对象:GregorianCalendar类

要么调用他的静态方法getInstance();

就是一个类,里面好多好多属性,比如今年第几天,第几个月(1月返回0),本月第几天.可以get,set

Calendar c = Calendar.getInstence();. //都一样,new出来的还是上面那个子类
Date d=c.getTime();
c=setTime(new Date());

3. JDK8新增时间类

简单的说,前面又白学了。。。。

事情是酱紫的,jdk1里面弄了个Date类,但是太操蛋了,上来就2134214124L,这谁受得了啊,

于是JDK1.1就搞了个Calendar类,so ,Date里面的n多方法属性就弃用了

首当其冲的就是带参构造器,真是tm离谱他妈给离谱开门啊,注意啊,不是弃用了,是tm别用了 (想想第一次学数组的时候不知道为啥第一个元素是index 0,再想想你求 i j 之间距离的时候)

但是呢,Calendar也不咋地,比如啊,SimpleDateFomat用不了了,因为他是针对Date设计的,同时呢,也看见了随便一个set方法就能改变Calendar的值,别问今天周几,问就是周末,永远周末。

于是乎,,sum在折磨程序员长达7个大版本之后,终于在JDK8里面添加了 java.time

J8之前程序员是怎么过日子的了,就靠一个叫Joda-Time的 jar包活着了。没错,java.time就是抄袭他的,臭不要脸,抄都抄了这么久

(PS:为啥加了个Local,)

3.1 Local系列

//实例化,要么用静态方法now()
LocalDate localDate= LocalDate.now();
LocalTime localTime=LocalTime.now();
LocalDateTime localDateTime=LocalDateTime.now(); //你瞅他最长,用的也最多
System.out.println(localDate);//2021-12-01
System.out.println(localTime);//22:03:43.489091500
System.out.println(localDateTime);//2021-12-01T22:03:43.489091500

//要么用静态方法of(),就可以指定日期时间了
LocalDateTime of = LocalDateTime.of(2020, 12, 3, 22, 0, 1);


//getXxxx(),这仨类该有的都有,但是别去LocalDate里面去getHour
System.out.println(localDate.getDayOfMonth());


//设置时间
//Local系列是怎么防止你瞎改时间呢,嗯..... 他返回了个新对象
//withXxxx(),直接设置新值
LocalDate localDate1=localDate.withMonth(7);
System.out.println(localDate1); //2021-07-01 PS:做笔记的时候我穿的羽绒服

//plusXxxx(),在现有时间上往上加时间,仍然返回新对象
//minusXxxx(),减.... 弄个负数不就行了额

//Xxxx方法都有哪些呢,问IDE去

3.2 Instant类 瞬时

其实又回到以前了,很类似Date类,记录瞬时的,但是他能精确到纳秒

//实例化方法:
Instant now = Instant.now();
System.out.println(now); //他显示的是UTC,兔子用的是东8区,加8就ok了

//添加时间的偏移量,返回值可就变了
OffsetDateTime off = now.atOffset(ZoneOffset.ofHours(8));
System.out.println(off);//这回就对了

long l = now.toEpochMilli();//距离1970-1-1 0:0:0(UTC)的纳秒数,
//类似于Date.getTime() 除以个1000就能去构造Date了

//实例化的方式2: of方法
Instant instant = Instant.ofEpochMilli(l);

3.3 格式化和解析

java.time.format.DateTimeFormatter类

//实例化1,使用ISO标准
DateTimeFormatter format1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime now1 = LocalDateTime.now();
System.out.println(now1);//2021-12-01T22:36:06.191583900
String str1 = format1.format(now1);
System.out.println(str1);//2021-12-01T22:36:06.1915839

//解析
TemporalAccessor parse = format1.parse(str1);
//他的parse也不知道你要解析的字符串出来的时间类型是哪个LocalXxx,所以返回值是接口,LocalXxxx都实现了的
System.out.println(parse);//{},ISO resolved to 2021-12-01T22:38:57.304561400
//因为是个接口,所以打印结果长得比较奇葩


//实例化2,本地化相关的格式
DateTimeFormatter format2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
//常见传入的有三种:FormatStyle.LONG MEDIUM SHORT

//LONG在J8下没事,J11下会报错,需要最后添加.withZone(ZoneId.systemDefault());
//DateTimeFormatter format2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withZone(ZoneId.systemDefault());
//systemDefault()方法获取系统默认时区,返回值是区域ID

//ofLocalizedDate()适用的格式为:FormatStyle.FULL  LONG   MEDIUM  SHORT

//格式化
String str2 = format2.format(now1);
System.out.println(str2);
format2.parse(str2);


//方式3:自定义格式,通常都用这个
DateTimeFormatter format3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//cao,HH是24进制,hh是12进制
String str3 = format3.format(LocalDateTime.now());
System.out.println(str3);
TemporalAccessor parse3 = format3.parse("2020-12-21 22:21:12");
System.out.println(parse3);