一、Java 日期时间
1、概述
- 强调: java的日期操作是通过3个类完成的
- 包含
(1) Date: 每个实例表示一个确切的时间点
(2) SimpleDateFormat: 根据一个给定的日期格式将String与Date相互转换
(3) Calendar: 其方法对时间分量进行运算
2、Date
- 毫秒数: 内部维护一个long值,记录1970年1月1日 00:00:00到确切时间点所经过的毫秒值
- 方法: 由于Date存在设计缺陷(千年虫,时区),大部分方法已过时,不建议使用
(1) Date() : 获得当前系统时间
(2) getTime():获得内部毫秒数
(3) setTime():设置内部毫秒数 - 实例
// 使用默认的构造方法表示前系统时间
Date date = new Date();
// Wed Jul 24 23:33:31 CST 2019
System.out.println(date);
// 获取内部维护的long值
long time = date.getTime();
// 1564068811517
System.out.println(time);
// 明天这一刻的毫秒值
time += 1000*60*60*24;
// 设置一个long值,让Date表示该long值所表示的时间
date.setTime(time);
// Thu Jul 25 23:33:31 CST 2019
System.out.println(date);
3、SimpleDateFormat
-
日期格式字符串
(1) 类似于正则表达式的字符串
(2) y: 表示年,通常是yyyy或yy
(3) M: 表示月,通常是MM或M
(4) d: 表示天,通常是dd
(5) H: 表示时,通常是HH或者hh
(6) m: 表示分,通常是mm
(7) s: 表示秒,通常是ss -
Date 转 String
(1) 方法: format(Date: date)
(2) 实例:
Date now = new Date();
// 声明日期格式字符串
String format = "yyyy-MM-dd HH:mm:ss";
// 实例化格式对象
SimpleDateFormat sdf = new SimpleDateFormat(format);
// 调用转换方法
String str = sdf.format(now);
// 2019-07-28 13:56:37
System.out.println(str);
- String 转 Date
(1) 方法: parse(String: str)
(2) 注意: 这个方法要求捕获异常
(2) 实例
String str = "2008年8月21日 23:44:21";
String format = "yyyy年MM月dd日 HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(format);
// 调用转换方法
Date date = sdf.parse(str);
// Thu Aug 21 23:44:21 CST 2008
System.out.println(date);
4、Calendar
-
概述
(1) Calendar是一个抽象类,用于封装日历信息
(2) Calendar子类针对不同国家的日历系统,默认阳历 -
Calendar对象
(1) 通常通过Calendar的静态方法getInstance获得Calendar对象
(2) getInstance根据系统的地域信息返回不同Calendar类的实现
(2) Calendar内部表示一个时间,默认创建出来的Calendar表示当前系统时间
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
- Calendar 与 Date相互转换
(1) Calendar 转 Date: getTime()
(2) Date 转 Calendar: setTime(Date: date)
Calendar -> Date
Calendar c1 = Calendar.getInstance();
// 返回一个Date对象
Date d1 = c1.getTime();
System.out.println(d1);
Date -> Calendar
Date d2 = new Date();
Calendar c2 = Calendar.getInstance();
// 把Date转换为Calendar
c2.setTime(d2);
- 设置时间分量
(1) 方法: set(int field, int value)
(2) 实例:
Calendar calendar = Calendar.getInstance();
// 设置年
calendar.set(Calendar.YEAR, 2008);
// 设置月, 月份从0开始,0表示1月,11表示12月
calendar.set(Calendar.MONTH,7);
// 设置天
// DATE 通常说的"号"
// DAY_OF_MONTH 通常说的"号"
// DAY_OF_YEAR 年中的第几天
// DAY_OF_WEEK 星期几,1表示周日,2表示周一
calendar.set(Calendar.DAY_OF_MONTH, 8);
// 设置时
calendar.set(Calendar.HOUR_OF_DAY, 17);
// 设置分
calendar.set(Calendar.MINUTE, 22);
// 设置秒
calendar.set(Calendar.SECOND,55);
Date date = calendar.getTime();
System.out.println(date);
- 获取时间分量
(1) 方法: get(int field)
(2) 获取最大值: getActualMaximum(int field)
(3) 实例:
Calendar calendar = Calendar.getInstance();
// 获取年
int year = calendar.get(Calendar.YEAR);
// 获取月
int month = calendar.get(Calendar.MONTH)+1;
// 获取天 DATE 与 DAY_OF_MONTH功能一致
int day = calendar.get(Calendar.DATE);
// 获取时
int hour = calendar.get(Calendar.HOUR_OF_DAY);
// 设置分
int minute = calendar.get(Calendar.MINUTE);
// 设置秒
int second = calendar.get(Calendar.SECOND);
// 获取星期几
int dow = calendar.get(Calendar.DAY_OF_WEEK);
// 获取今天是今年第几天
int doy = calendar.get(Calendar.DAY_OF_YEAR);
// 获取当月一共多少天
int days = calendar.getActualMaximum(DAY_OF_MONTH)
- 时间分量的运算
(1) 方法: add(int field, int value)
(2) 注意: value为正数时做加法,为负数时做减法
(3) 实例:
Calendar calendar = Calendar.getInstance();
//加3年
calendar.add(Calendar.YEAR, 3);
//加2个月
calendar.add(Calendar.MONTH, 2);
//减去30天 对天的加减只用DAY_OF_YEAR
calendar.add(Calendar.DAY_OF_YEAR, -30);
System.out.println(calendar.getTime());