1、JDK8之前的日期时间API

1.1、System类currentTimeMillis()

System类中静态的方法currentTimeMillis()返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差

称为 时间戳

class Untitled {
	public static void main(String[] args) {
		long time = System.currentTimeMillis();
		System.out.println(time);   //1629968985406
	}
}

1.2、两个Date类

父类 java.util.Date
————————子类 java.sql.Date

1、实例化:
Date() :无参构造器获取本地当前时间
Date(long l): 放入时间戳获取时间
Date(年,月,日,时,分,秒):已过时,不推荐用(有偏移量)

2、常用方法
getTime() :返回当前Date对应的毫秒数。(时间戳)
toString() : 返回当前时间 Thu Aug 26 09:04:17 UTC 2021

import java.util.Date;
class Untitled {
	public static void main(String[] args) {
		//构造器一:Date()
		Date dd = new Date();
		//两个方法
		System.out.println(dd); //Thu Aug 26 09:04:17 UTC 2021
		System.out.println(dd.getTime());  //1629968985406
		
		//构造器二:Date(long l)
		Date dd1 = new Date(1630032352647L);
		System.out.println(dd1); //Fri Aug 27 02:45:52 UTC 2021
		
		//构造器三:会有偏移量
		//年份输入2021,代表1900+2021。月份输入8,代表的是九月份。
		Date dd2 = new Date(2021,8,27,10,47,50);
		System.out.println(dd2);//Tue Sep 27 10:47:50 UTC 3921
	}
}

子类 java.sql.Date 代表数据库中日期类型的变量

1、实例化:放入时间戳获取时间
new java.sql.Date(1630032487511L);

class Untitled {
	public static void main(String[] args) {
		//构造器一:Date()
		java.sql.Date dd = new java.sql.Date(1630032487511L);
		System.out.println(dd);   //2021-08-27
	}
}

2、如何将 java.sql.Date 对象转换为 java.util.Date 对象
向上转型——多态。子父类的关系

3、如何将 java.util.Date 对象转换为 java.sql.Date 对象
向上转型——多态
借用时间戳new java.sql.Date(new Date().getTime());

import java.util.Date;
class Untitled {
	public static void main(String[] args) {
		//将 java.util.Date  对象转换为  java.sql.Date 对象
		//情况一:使用多态向下转型
		java.util.Date dd1 = new java.sql.Date(1630032487511L);
		java.sql.Date dd2 = (java.sql.Date)dd1;
		System.out.println(dd2);   //2021-08-27
		
		//情况二:
		Date dd3 = new Date(1630032487511L);
		//编译报错
		//java.sql.Date dd2 = (java.sql.Date)dd3;
		java.sql.Date dd4 = new java.sql.Date(dd3.getTime());
		System.out.println(dd4);   //2021-08-27
	}
}

1.3、SimpleDateFormat

1、实例化
SimpleDateFormat():默认日期格式
SimpleDateFormat("yyyy-MM-dd hh:mm:ss"):指定日期格式

2、格式化: java.util.Date 日期—>字符串
调用实例方法format(Date dd)方法

import java.util.Date;
import java.text.SimpleDateFormat;
class Untitled {
	public static void main(String[] args) {
		//默认日期格式
		SimpleDateFormat s = new SimpleDateFormat();
		
		//格式化:日期--->字符串
		Date dd = new Date();
		String str = s.format(dd);
		System.out.println(str); //8/27/21, 3:52 AM
	}
}

3 、解析:字符串 —>日期 java.util.Date

调用实例方法parse(String s)

默认日期格式
需要注意SimpleDateFormat实例化时候的日期格式

import java.util.Date;
import java.text.SimpleDateFormat;
class Untitled {
	public static void main(String[] args) {
		//默认日期格式
		SimpleDateFormat s = new SimpleDateFormat();
		
		//解析:字符串 --->日期
		String str = "8/27/21, 3:52 AM";
		try{
			Date dd = s.parse(str);
			System.out.println(dd);//Fri Aug 27 03:52:00 UTC 2021
		}catch(Exception e){
		}
	}
}

指定日期格式
需要注意SimpleDateFormat实例化时候的日期格式

import java.util.Date;
import java.text.SimpleDateFormat;
class Untitled {
	public static void main(String[] args) {
		//指定日期格式
		SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		
		//格式化:日期--->字符串
		Date dd = new Date();
		String str = s.format(dd);
		System.out.println(str); //2021-08-27 05:17:48
		
		//解析:字符串 --->日期
		String str1 = "2021-08-27 05:17:48";
		try{
			Date dd2 = s.parse(str1);
			System.out.println(dd2);//Fri Aug 27 05:17:48 UTC 2021
		}catch(Exception e){
		}
	}
}

练习题一:

字符串 2021-09-08 转换为 java.sql.Date

import java.util.Date;
import java.text.SimpleDateFormat;
class Untitled {
	public static void main(String[] args) {
		SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
		String str = "2021-09-08";
		try{
			Date dd = s.parse(str);
			System.out.println(dd);
			java.sql.Date dd1 = new java.sql.Date(dd.getTime());
		}catch(Exception e){
		}
	}
}

1.4、Calendar(抽象类)

注意 Calendar是一个抽象类

1、实例化
①创建其子类GregorianCalendar的对象
②调用静态方法getInstance() ,其实这个方法返回的也是子类的对象

2、常用方法(实例方法)

get()方法

注意:
获取月份时:一月是0、二月是1…12月是11
获取星期时:周日是1、周一是2…周六是7

class Untitled {
	public static void main(String[] args) {
		Calendar cc = Calendar.getInstance();
		int i1 = cc.get(Calendar.DAY_OF_MONTH);
		System.out.println(i1);        //27
		int i2 = cc.get(Calendar.DAY_OF_YEAR);
	}
}

set()方法。无返回值,直接修改对象本身

修改的是日历类对象本身,体现了可变性

class Untitled {
	public static void main(String[] args) {
		Calendar cc = Calendar.getInstance();
		//修改之前
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));      //27
		
		cc.set(DAY_OF_MONTH,15);
		
		//修改之后
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));      //15
	}
}

add()方法。无返回值,直接修改对象本身

修改的是日历类对象本身,体现了可变性

class Untitled {
	public static void main(String[] args) {
		Calendar cc = Calendar.getInstance();
		//修改之前
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));      //27
		
		//增加
		cc.add(DAY_OF_MONTH,1);
		
		//修改之后
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));      //28
		
		//减少
		cc.add(DAY_OF_MONTH,-5);
		
		//修改之后
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));      //23
	}
}

getTime()方法

日历类 —> java.util.Date 日期

class Untitled {
	public static void main(String[] args) {
		Calendar cc = Calendar.getInstance();
		Date dd = cc.getTime();
		System.out.println(dd);
	}
}

setTime(Date dd)方法。无返回值,直接修改对象本身

java.util.Date 日期 —> 日历类

class Untitled {
	public static void main(String[] args) {
		Date dd = new Date();
		Calendar cc = Calendar.getInstance();
		cc.setTime(dd);
		System.out.println(cc.get(Calendar.DAY_OF_MONTH));
	}
}

2、JDK8的日期时间API

2.1、LocalDate、 LocalTime、 LocalDateTime

方法概述
now() 、 now(int i)静态方法,当前时间创建对象、指定时区创建对象
of()静态方法,根据指定日期创建对象
getDayOfMonth()、getDayOfYear()获取月份天数,获取年份天数
getDayOfWeek()获取星期几(返回一个 DayOfWeek 枚举值)
getMonth()获取月份,返回 Month 枚举值
getMonthValue() 、getYear()获取月份数字,获得年份
getHour() 、getMinute()、getSecond()获取当前对象的时分秒
withDayOfMonth()、withDayOfYear() 、withMonth() 、withYear()修改为指定值并返回对象,不可变性
plusHours() 、plusDays()、plusWeeks()、plusMonths()、plusYears()当前对象添加几天、几周、几年等等
minusHours() 、minusDays()、minusWeeks()、minusMonths()、minusYears()当前对象减去几天、几周、几年等等

实例化、获取时间

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
class Untitled {
	public static void main(String[] args) {
		LocalDateTime dd = LocalDateTime.now();
		System.out.println(dd);
		
		//of():设置指定时间,没有偏移量
		LocalDateTime dd1 = LocalDateTime.of(2021,08,27,15,17,55);
		System.out.println(dd1);
		
		//getXxx()
		System.out.println(dd1.getDayOfMonth());
	}
}

更改时间,体现不可变性

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
class Untitled {
	public static void main(String[] args) {
		//withXxx()
		LocalDateTime dd1 = LocalDateTime.of(2021,08,27,15,17,55);
		LocalDateTime dd2 = dd1.withDayOfMonth(12);
		System.out.println(dd1);   //体现不可变性
		System.out.println(dd2);
		
		//plusXxx()
		LocalDateTime dd3 = dd1.plusDays(5);
		System.out.println(dd1);   //体现不可变性
		System.out.println(dd3);
		
		//minusXxx()
		LocalDateTime dd4 = dd1.minusDays(5);
		System.out.println(dd1);   //体现不可变性
		System.out.println(dd4);
	}
}

2.2、Instant 瞬时

now():返回当前本初子午线对应的标准时间

class Untitled {
	public static void main(String[] args) {
		Instant ii = Instant.now();
		System.out.println(ii);
	}
}

atOffset():返回指定时区的时间

class Untitled {
	public static void main(String[] args) {
		Instant ii = Instant.now();
		OffsetDateTime oo = ii.atOffset(ZoneOffset.ofHours(8));
		System.out.println(oo);
	}
}

toEpochMilli():获取当前本初子午线上标准时间的自1970年1月1日0时0分0秒起算的毫秒数——时间戳

class Untitled {
	public static void main(String[] args) {
		Instant ii = Instant.now();
		long ll = ii.toEpochMilli();
		System.out.println(ll);
	}
}

ofEpochMilli():静态方法。通过指定时间戳返回 Instant对象

class Untitled {
	public static void main(String[] args) {
		Instant ii = Instant.ofEpochMilli(1213512121L);
		System.out.println(ii);
		
		//类似于
		Date dd = new Date(4545646465456L);
		System.out.println(dd);
	}
}

2.3、java.time.format.DateTimeFormatter

SimpleDateFormat()的日期格式就只有默认格式和指定格式两种情况

DateTimeFormatter日期格式分三种情况

①格式化:日期 ——> 字符串
调用实例方法format(TemporalAccessor ll)

注意: 因为LocalDateTime等类实现了 TemporalAccessor 接口,所以可以传入这些类的对象

②解析:字符串 ——> 日期
调用实例方法parse(String s)

情况一:预定义的标准格式
ISO_LOCAL_DATE_TIME
ISO_LOCAL_DATE
ISO_LOCAL_TIME

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
class Untitled {
	public static void main(String[] args) {
		DateTimeFormatter dd = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
		
		//格式化:日期 ——> 字符串
		LocalDateTime ll = LocalDateTime.now();
		String s = dd.format(ll);
		System.out.println(ll);  //LocalDateTime的对象不会受到改变
		System.out.println(s);
		
		//解析:字符串 ——> 日期
		TemporalAccessor pp = ll.parse("2021-08-27T08:08:50.012895");
	}
}

情况二:本地化相关的格式of.LocalizedDateTime()
FormatStyle.LONG
FormatStyle.MEDIUM
FormatStyle.SHORT
适用于: LocalDateTime

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
class Untitled {
	public static void main(String[] args) {
		DateTimeFormatter dd = of.LocalizedDateTime(FormatStyle.SHORT);
		
		//格式化:日期 ——> 字符串
		LocalDateTime ll = LocalDateTime.now();
		String s = dd.format(ll);
		System.out.println(ll);//她永远是她,不会变
		System.out.println(s);
		
		//解析:字符串 ——> 日期
		TemporalAccessor pp = ll.parse("  ");
	}
}

本地化相关的格式 of.LocalizedDate()
FormatStyle.FULL
FormatStyle.LONG
FormatStyle.MEDIUM
FormatStyle.SHORT
适用于: LocalDate

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
class Untitled {
	public static void main(String[] args) {
		DateTimeFormatter dd = of.LocalizedDate(FormatStyle.FULL);
		
		//格式化:日期 ——> 字符串
		String s = dd.format(LocalDate.now());
		System.out.println(s);
	}
}

重点!!!

情况三: 自定义的格式 ofPattern("yyyy-MM-dd hh:mm:ss")

class Untitled {
	public static void main(String[] args) {
		DateTimeFormatter dd = ofPattern("yyyy-MM-dd hh:mm:ss");
		
		//格式化:日期 ——> 字符串
		String s = dd.format(LocalDateTime.now());
		System.out.println(s);
	}
}

3、小结

JDK8之前的日期时间API

  1. System类的静态方法currentTimeMillis(),时间戳
  2. 两个Date
  3. java.util.Date子类
    1. Date() :无参构造器获取本地当前时间
    2. Date(long l): 放入时间戳获取时间
    3. Date(年,月,日,时,分,秒):会有偏移量
    4. getTime() :返回当前Date对应的毫秒数。(时间戳)
    5. toString() : 返回当前时间(已被重写)Thu Aug 26 09:04:17 UTC 2021
  4. java.sql.Date子类
    1. 实例化:new java.sql.Date(1630032487511L);
    2. 将 java.util.Date 对象转换为 java.sql.Date 对象
      ① 向上转型——多态
      ② 借用时间戳new java.sql.Date(new Date().getTime());
  5. SimpleDateFormat
    1. 实例化
      SimpleDateFormat():默认日期格式
      SimpleDateFormat("yyyy-MM-dd hh:mm:ss"):指定日期格式
    2. 格式化: java.util.Date 日期—>字符串
      调用实例方法format(Date dd)
    3. 解析:字符串 —>日期 java.util.Date
      调用实例方法parse(String s)
  6. Calendar
    1. 实例化
      ①创建其子类GregorianCalendar的对象
      ②调用静态方法getInstance() ,其实这个方法返回的也是子类的对象
    2. 常用方法(实例方法)
      1. get()方法
      2. set()方法。无返回值,直接修改对象本身
      3. add()方法。无返回值,直接修改对象本身
      4. getTime()方法
        日历类 —> java.util.Date 日期
      5. setTime(Date dd)方法。无返回值,修改对象本身
        java.util.Date 日期 —> 日历类

JDK8的日期时间API

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐