Java高级编程--JDK8之前日期时间API
在开发过程中我们常常会碰到要处理时间的需求,本篇博客将介绍在JDK8之前日期时间API的使用。
目录:
☍ java.util.Date类和子类java.sql.Date类
▾ java.lang.System类
System类提供的public static long currentTimeMillis()用来返回当前时
间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
☄ 此方法适于计算时间差(时间戳)。
计算世界时间的主要标准有:
☃ 此方法适于计算时间差(时间戳)。
☃ 此方法适于计算时间差(时间戳)。
☃ 此方法适于计算时间差(时间戳)。
Long thisTime = System.currentTimeMillis();
System.out.println(thisTime); //Thu Jun 11 08:53:39 CST 2020对应的时间差1591836819476
▾ java.util.Date类和子类java.sql.Date类
表示特定的瞬间,精确到毫秒
Date()构造器:
➣ Date():使用无参构造器创建的对象可以获取本地当前时间。
➣ Date(long millis):指定毫秒数(时间戳)的日期时间对象。
➣ Date(int year, int month, int day):指定年月日,year从1900年开始,月份从0开始,已过时。
Date类常用方法:
➣ getTime():返回自 1970年1月1日 00:00:00 GMT以来的时间戳,等同于System.currentTimeMillis()。
➣ toString():把此 Date 对象转换为默认格式的字符串如:Mon Jun 13 09:40:30 CST 2020。
/**java.util.Date的日期类*/
//空参为默认当前时间对象
Date date1 = new Date();
//date.toString()方法返回的是当前日期和时间信息
System.out.println("date1:" + date1.toString()); //Thu Jun 11 08:48:39 CST 2020
//时间戳/毫秒数 等同于System.currentTimeMillis()
System.out.println("date1:" + date1.getTime()); //1591836915818
//Long l参数的构造器 指定时间戳(毫秒数)日期对象
Date date2 = new Date(1591836829476L);
System.out.println("date2:" + date2.toString()); //Thu Jun 11 08:53:49 CST 2020
java.sql.Date类与java.util.Date类的转换:
由于java.sql.Date是java.util.Date的子类,所以这两个类的创建方式和大多数方法基本相同,需要注意sql.Date类无空参构造器,使用 new Date(Long millis)进行实例化操作
java.sql.Date类对应着数据库中的日期类型的变量,多在与数据库交互时使用,其格式与java.util.Date有所区别,格式如:2020-06-11
✥ sql.Date<-->util.Date的转换
➣ 向上转型(自动) java.util.Date date = new java.sql.Date(Long millis);
✥ util.Date-->sql.Date
➣ 通过时间戳/毫秒数转换 java.sql.Date date = new java.sql.Date(new java.util.Date().getTime());
错误方式:不能强制向下转型 报ClassCastException错误 java.sql.Date date = (java.util.Date) new java.util.Date();
/**sql.Date与util.Date的转换*/
//sql.Date转为util.Date
//sql.Date-->sql.Date 自动向上转型 注意sql.Date的构造器必须有参数Long millis
Date date5 = new java.sql.Date(1591836915818L);
System.out.println("date5:" + date5);
//util.Date-->sql.Date 不能强制向下转型 报ClassCastException错误
//java.sql.Date date6 = (java.sql.Date)date1;
// System.out.println("date6:" + date6);
//util.Date-->sql.Date 通过时间戳(毫秒数转换)
java.sql.Date date7 = new java.sql.Date(new Date().getTime());
System.out.println("date7:" + date7);
▾ SimpleDateFormat类
Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat
类是一个不与语言环境有关的方式来格式化和解析Date日期的具体类。
SimpleDateFormat类的实例化操作:
➣ new SimpleDateFormat():使用无参构造器创建默认格式的SimpleDateFormat对象。
➣ new SimpleDateFormat(String pattern):使用String pattern构造器创建自定义格式的SimpleDateFormat对象。
SimpleDateFormat类的格式化和解析操作:
➣ public String format(Date date) :方法格式化时间对象date,返回字符串
➣ public String format(Date date) : public Date parse(String source):将字符串按SimpleDateFomat的格式转换为Date对象,返回Date类对象。
SimpleDateFormat类的格式化和解析操作:
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era年代标志符 | Text | 公元; AD |
y | 年 | Year | 2020; 20 |
M | 年中的月份 | Month | June; Jun; 06 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 3 |
D | 年中的天数 | Number | 169 |
d | 月份中的天数 | Number | 14 |
F | 月份中的星期 | Number | 3 |
E | 星期的天数 | Text | TuseDay; Tue;星期四 |
a | Am/Pm标记 | Text | PM; 下午 |
H | 小时(0-23) | Number | 0 |
k | 小时(1-24) | Number | 24 |
K | 小时(0-11) | Number | 0 |
h | 小时(1-12) | Number | 12 |
m | 分钟 | Number | 30 |
s | 秒 | Number | 59 |
S | 毫秒(1秒=1000毫秒) | Number | 698 |
z | 时区 | General time zone | PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
//空参实例化SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化: 日期Date对象 ---> 字符串
Date date1 = new Date();
System.out.println(date1); //Fri Jun 12 16:45:34 CST 2020
String time1 = sdf.format(date1);
System.out.println(time1); //20-6-12 下午4:45
//解析:格式化的逆过程 字符串 ---> 日期Date对象 默认方式如:20-6-12 下午4:45
String time2 = "20-11-12 下午4:45";
Date date2 = sdf.parse(time2);
//Date date3 = sdf.parse("2020-06-12");// 传入的字符串格式与SimpleDateTime格式不同 ParseException异常
System.out.println(date2);
//自定义实例化SimpleDateFormat
SimpleDateFormat sdf1 = new SimpleDateFormat("G M yyyy-MM-dd M E a HH:mm:ss:SS z");
System.out.println(sdf1.format(date1)); //公元 6 2020-6-12 6 星期五 下午 17:37:21:548 CST
//指定的什么格式,解析时传入的参数就需要是什么格式,否则会报ParseException异常
Date date3 = sdf1.parse("公元 6 2020-6-12 6 星期五 下午 17:37:21:548 CST");
System.out.println(date3);
▾ Calendar日历类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
Calendar实例化操作:
➣ 使用Calendar.getInstance()方法(常用)。
➣ 调用它的子类GregorianCalendar的构造器。
Calendar类常用方法:
➣ public int get(int get filed):获取指定信息,如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND。
➣ public void set(int field, int value):与get(xxx)对应,设置Calendar相应变量的值,如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND。
➣ public void add(int field, int amount):将对应信息加值,负数为减值。
➣ public final Date getTime():将calendar对象转换为Date对象,返回Date对象。
➣ public long getTimeInMillis():将calendar对象转换为Long型毫秒数。
➣ public final void setTime(Date date):将calendar对象设置为对应的Date对象(对原对象的操作)。
➣ public void setTimeInMillis(long millis):将calendar对象设置为对应的毫秒数时间(对原对象的操作)。
✦ 获取月份时:一月是0,二月是1,以此类推,12月是11
✦ 获取星期时:周日是1,周二是2 ......周六是7
public void testCalendar(){
/*1、实例化Calendar abstract类 通过子类创建对象
方式一:创建子类(GregorianCalendar)
方式二:调用其静态方法getInstance() 常用
*/
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass()); //也是通过子类GregorianCalendar实现
/*2、Calendar类常用方法
calendar.get(xxx) 获取常用信息,如年、月、日、周等
calendar.set(xxx,value) 与get()对应,设置信息
calendar.add(xxx,int value) 将对应信息加值,负数为减值
calendar.getTime() 将calendar对象转换为Date对象,返回Date
calendar.getTimeMillis() 获取毫秒数,返回Long
calendar.setTime(Date date) 将Date对象值设置到calendar对象中
calendar.setTimeInMillis(Long millis) 将毫秒数值设置到calendar对象中
*/
//get(xxx) Calendar定义了很多static变量,如今天是这个月的第几天,年份,月等
// 通过get()可以获取到这些信息
System.out.println("--------get()------");
int month = calendar.get(Calendar.MONTH);
System.out.println("Calendar.MONTH:"+month); //月份下标从0开始
System.out.println("Calendar.DAY_OF_MONTH:" + calendar.get(Calendar.DAY_OF_MONTH));
//set(xxx,value) 与get(xxx)对应,设置Calendar相应变量的值
System.out.println("---------set()---------");
calendar.set(Calendar.DAY_OF_WEEK,1);
//注意:一周中的第几天从周日下标为1开始到周六为7结束
System.out.println("set(Calendar.DAY_OF_WEEK,1)后Calendar.DAY_OF_MONTH:" + calendar.get(Calendar.DAY_OF_MONTH));
//add()
System.out.println("---------add()--------");
calendar.add(Calendar.DAY_OF_WEEK,6);
System.out.println("在原来的基础上加6天:" + calendar.get(Calendar.DAY_OF_MONTH)); //周六
calendar.add(Calendar.YEAR,-1); //负数相当于减
System.out.println(calendar.get(Calendar.YEAR)); //2019
//getTime() Calendar类 --> Date类
System.out.println("--------getTime()--------");
Date date1 = calendar.getTime();
System.out.println(date1);
//getTimeMillis() 获取毫秒数,相当于Date.getTime() 和 System.currentTimeMillis()
System.out.println("--------getTimeMillis()--------");
Long millis = calendar.getTimeInMillis();
System.out.println(millis);
//setTime(Date date) 与getTime()对应 Date类 --> Calendar类
System.out.println("--------setTime()--------");
Date date2 = new Date();
calendar.setTime(date2);
System.out.println(calendar.get(Calendar.YEAR)); //2020
//setTimeInMillis(Long millis)
System.out.println("--------setTimeInMillis()--------");
calendar.setTimeInMillis(millis);
System.out.println("当前分钟:"+calendar.get(Calendar.MINUTE));
}
JDK8新增的日期时间API↷传送门
本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布