系列文章目录

文章目录

  • ​​系列文章目录​​
  • ​​一、日期时间APIJDK1.8之前​​
  • ​​二、日期时间APIJDK1.8之后​​
  • ​​1、JDK1.8之后引入了一些新的时间日期API,是什么原因呢?​​
  • ​​2、新版的日期时间API对旧版的补充​​
  • ​​总结​​

一、日期时间APIJDK1.8之前

日期时间的API:

1、包:java.util.Date

(1)new Date() 得到日期

(2)new Date(毫秒) 将毫秒转化为日期

(3)long getTime() 得到一个毫秒

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_02


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_03


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_04


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_05


如果毫秒太小了,能不能用分钟之类的?

当然也是可以的2、java.util.Calendar:日历类型

抽象类,它有子类GregorianCalendar

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_06


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_07


3、时区

java.util.TimeZone

static TimeZone getTimeZone(String ID)

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_08


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_09


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_10


4、格式化的问题

包:java.text.DateFormat 也是一个抽象类

我们得用它的子类:java.text.SimpleDateFormat

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_11

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_12


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_13


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_14


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_15


反过来,如果用户输入了一段字符串,我们也可以把它变成日期

需要注意的是,方法不一样了,并且有可能会解析失败

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_16


代码:

package com.atguigu.test11;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.junit.Test;

/*
* 日期时间的API:
* 1、JDK1.8之前
* 2、JDK1.8之后
*
* 一、JDK1.8之前
* 1、java.util.Date
* (1)new Date()
* (2)new Date(毫秒)
* (3)long getTime()
*
* 2、java.util.Calendar:日历类型
* 抽象类,它有子类GregorianCalendar
*
* 3、java.util.TimeZone
* static TimeZone getTimeZone(String ID)
*
* 4、java.text.DateFormat
* java.text.SimpleDateFormat
*/
public class TestDate {
@Test
public void test10() throws ParseException{
String str = "2019年06月06日 16时03分14秒 545毫秒 星期四 +0800";
SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒 E Z");
Date d = sf.parse(str);
System.out.println(d);
}

@Test
public void test9(){
Date d = new Date();

SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒 E Z");
//把Date日期转成字符串,按照指定的格式转
String str = sf.format(d);
System.out.println(str);
}

@Test
public void test8(){
String[] all = TimeZone.getAvailableIDs();
for (int i = 0; i < all.length; i++) {
System.out.println(all[i]);
}
}

@Test
public void test7(){
TimeZone t = TimeZone.getTimeZone("America/Los_Angeles");

//getInstance(TimeZone zone)
Calendar c = Calendar.getInstance(t);
System.out.println(c);
}

@Test
public void test6(){
Calendar c = Calendar.getInstance();
System.out.println(c);

int year = c.get(Calendar.YEAR);
System.out.println(year);

int month = c.get(Calendar.MONTH)+1;
System.out.println(month);

//...
}

@Test
public void test5(){
long time = Long.MAX_VALUE;
Date d = new Date(time);
System.out.println(d);
}

@Test
public void test4(){
long time = 1559807047979L;
Date d = new Date(time);
System.out.println(d);
}
@Test
public void test3(){
Date d = new Date();
long time = d.getTime();
System.out.println(time);//1559807047979
}

@Test
public void test2(){
long time = System.currentTimeMillis();
System.out.println(time);//1559806982971
//当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
}

@Test
public void test1(){
Date d = new Date();
System.out.println(d);
}
}

二、日期时间APIJDK1.8之后

1、JDK1.8之后引入了一些新的时间日期API,是什么原因呢?

(1)之前也说了月份从0开始这种偏移性的问题,被很多人吐槽
(2)对象的可变性问题,因为有一些不可变对象,比如:String、包装类对象,修改就会新对象
大多数程序员认为,一个日期时间的对象,应该对应一个日期时间的点,不应该变化,
如果想要代表另一个日期时间点,应该用另一个对象来表示,即对象日期时间对象的修改,应该产生新对象,而不是修改原来的对象。
新版的日期时间对象,不可变,一旦修改会返回新对象。
(3)格式化:旧版只支持Date
(4)旧版日期时间API:它们也不是线程安全的,不能处理闰秒(可自行百度),新版本中自动解决了润秒的问题

2、新版的日期时间API对旧版的补充

1、基本类型

LocalDate:本地日期

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_17


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_18

LocalTime:本地时间

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_19


Eugene既要日期又要时间怎么做呢?如下:

LocalDateTime:本地日期时间

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_20


这三个代替原来的java.util.Date和java.util.Calendar(日历)

(1)now()

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_21


(2)of(xx)

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_22


(3)getXxx():获取什么值

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_23


(4)plusXxx:加上什么。比如加160天

类似于 C#里面的addDay(160)

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_24

(5)minusXxx:减去什么,比如减100天

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_25

(6)isLeapYear():是否是闰年

2、日期时间格式化

对应于老版:SimpleDateFormat

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_26


还有预定义的格式,也可以应用

还有这种格式是我们有时候常用的

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_java_27


00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_28

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_日期时间_29


其中ISO的意思就是国际标准java 8API:

00018.06 日期时间API(JDK1.8之前和JDK1.8之后)_System_30

代码

package com.atguigu.test11;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;

import org.junit.Test;

/*
* 二、JDK1.8之后引入了新的日期时间API
* 旧的问题:
* (1)偏移性
* (2)对象的可变性问题
* 大多数程序员认为,一个日期时间的对象,应该对应一个日期时间的点,不应该变化,
* 如果想要代表另一个日期时间点,应该用另一个对象来表示。
* 即对象日期时间对象的修改,应该产生新对象,而不是修改原来的对象。
* 新版的日期时间对象,不可变,一旦修改会返回新对象。
*
* 不可变对象:String、包装类对象,修改就会新对象
*
* (3)格式化:旧版只支持Date
* (4)旧版日期时间API:它们也不是线程安全的,不能处理闰秒
*
* 新版的日期时间API对旧版有补充。
*
* 1、基本类型
* LocalDate:本地日期
* LocalTime:本地时间
* LocalDateTime:本地日期时间
*
* 这三个代替原来的java.util.Date和java.util.Calendar
*
* (1)now()
* (2)of(xx)
* (3)getXxx():获取什么值
* (4)plusXxx:加上什么
* (5)minusXxx:减去什么
* (6)isLeapYear():是否是闰年
* ...
*
* 2、日期时间格式化
* 对应于老版:SimpleDateFormat
*
*
*/
public class TestDate2 {
@Test
public void test10(){
LocalDateTime now = LocalDateTime.now();

// DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);//2019年6月6日 下午04时40分03秒
DateTimeFormatter df = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);//19-6-6 下午4:40
String str = df.format(now);
System.out.println(str);
}
@Test
public void test9(){
LocalDateTime now = LocalDateTime.now();

DateTimeFormatter df = DateTimeFormatter.ISO_DATE_TIME;//2019-06-06T16:38:23.756
String str = df.format(now);
System.out.println(str);
}

@Test
public void test8(){
LocalDateTime now = LocalDateTime.now();

DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒 E 是这一年的D天");
String str = df.format(now);
System.out.println(str);
}

@Test
public void test7(){
LocalDate now = LocalDate.now();
LocalDate before = now.minusDays(100);
System.out.println(before);//2019-02-26
}

@Test
public void test06(){
LocalDate lai = LocalDate.of(2019, 5, 13);
LocalDate go = lai.plusDays(160);
System.out.println(go);//2019-10-20
}

@Test
public void test05(){
LocalDate lai = LocalDate.of(2019, 5, 13);
System.out.println(lai.getDayOfYear());
}


@Test
public void test04(){
LocalDate lai = LocalDate.of(2019, 5, 13);
System.out.println(lai);
}

@Test
public void test03(){
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
}

@Test
public void test02(){
LocalTime now = LocalTime.now();
System.out.println(now);
}

@Test
public void test01(){
LocalDate now = LocalDate.now();
System.out.println(now);
}

}

总结

1、有新旧版本的区别,并不代表旧版就不能用了,新版只是对旧版的一个补充
2、对于新旧版本都应该学会,这样才能游刃有余,所以你学废了吗?