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);