目录
Date
Date的构造器
Date的常用方法
SimpleDateFormat
SimpleDateFormat的构造器
SimpleDateFormat的格式化方法
Calendar
Calendar日历类创建日历对象的方法
Calendar常用方法
JDK8新增日期类
LocalDate、LocalTime、LocalDateTime
Instant时间戳
DateTimeFormatter
Period
Duration
ChronoUnit
视频教程传送门 -> https://www.bilibili.com/video/BV1Cv411372m?p=118
DateDate类代表当前所在系统的日期时间信息
Date的构造器
public Date() -> 创建一个Date对象,代表的是系统当前此刻日期时间
public Date(long time) -> 把时间毫秒值转换成Date日期对象
Date的常用方法
public long getTime() -> 返回从1970年1月1日 00:00:00走到此刻的总的毫秒数
public void setTime(long time) -> 设置日期对象的时间为当前时间毫秒值对应的时间
=> 时间毫秒值恢复成日期对象的两种方式,以上紫色
SimpleDateFormat
完成日期时间的格式化操作
SimpleDateFormat的构造器
public SimpleDateFormat(String pattern) -> 构造一个SimpleDateFormat,使用指定的格式
SimpleDateFormat的格式化方法
public final String format(Date date) -> 将日期格式化成日期/时间字符串
public final String format(Object time) -> 将时间毫秒值式化成日期/时间字符串
public Date parse(String source) -> 从给定字符串的开始解析文本以生成日期
【例1】(1)格式化输出时间 -> 按照格式"yyyy年MM月dd日 HH:mm:ss EEE a" 输出当前时间,EEE代表星期几,a代表上午或下午 (2)解析字符串代表的时间并格式化输出
package com.test.d2_simpledateformat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo01 {
public static void main(String[] args) {
// 1、日期对象
Date d = new Date();
System.out.println(d);
// 2、格式化这个日期对象 (指定最终格式化的形式)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
// 3、开始格式化日期对象成为喜欢的字符串形式
String rs = sdf.format(d);
System.out.println(rs);
System.out.println("----------------------------");
// 4、格式化时间毫秒值
// 需求:请问121秒后的时间是多少
long time1 = System.currentTimeMillis() + 121 * 1000;
String rs2 = sdf.format(time1);
System.out.println(rs2);
}
}
输出为:
【例2】计算出 2021年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少
package com.test.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException {
// 目标: 学会使用SimpleDateFormat解析字符串时间成为日期对象。
// 有一个时间 2021年08月06日 11:11:11 往后 2天 14小时 49分 06秒后的时间是多少。
// 1、把字符串时间拿到程序中来
String dateStr = "2021年08月06日 11:11:11";
// 2、把字符串时间解析成日期对象(本节的重点):形式必须与被解析时间的形式完全一样,否则运行时解析报错!
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = sdf.parse(dateStr);
// 3、往后走2天 14小时 49分 06秒
long time = d.getTime() + (2L*24*60*60 + 14*60*60 + 49*60 + 6) * 1000;
// 4、格式化这个时间毫秒值就是结果
System.out.println(sdf.format(time));
}
}
输出结果为:
2021年08月09日 02:00:17
需要注意的两个地方
=> 写到 Line16有个感叹号提示,是因为parse()中的内容需要严格匹配格式,注意仔细检查
确认无误,加上抛出异常即可
=> Line19中的计算部分加上了个"L",防止计算值超出int范围
【例3】判断顾客的付款时间是否在秒杀时间之内,会用到Date的before和after方法比较时间
package com.test.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest3 {
public static void main(String[] args) throws ParseException {
// 1、秒杀开始 和 结束时间
String startTime = "2021-11-11 00:00:00";
String endTime = "2021-11-11 00:10:00";
// 2、小A 小B
String xiaoA = "2021-11-11 00:03:47";
String xiaoB = "2021-11-11 00:10:11";
// 3、解析他们的时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = sdf.parse(startTime);
Date d2 = sdf.parse(endTime);
Date d3 = sdf.parse(xiaoA);
Date d4 = sdf.parse(xiaoB);
if(d3.after(d1) && d3.before(d2)){
System.out.println("小A秒杀成功,可以发货了!");
}else {
System.out.println("小B秒杀失败!");
}
if(d4.after(d1) && d4.before(d2)){
System.out.println("小皮秒杀成功,可以发货了!");
}else {
System.out.println("小皮秒杀失败!");
}
}
}
输出为:
小A秒杀成功,可以发货了!
小皮秒杀失败!
Calendar
Calendar代表了系统此刻日期对应的日历对象,Calendar是一个抽象类,不能直接创建对象。
Calendar日历类创建日历对象的方法
根据API文档,可以使用方法得到对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);
输出如下,可以看到各个field的值 java.util.GregorianCalendar[time=1637679705878,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MonTH=10,WEEK_OF_YEAR=48,WEEK_OF_MonTH=4,DAY_OF_MonTH=23,DAY_OF_YEAR=327,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MonTH=4,AM_PM=1,HOUR=11,HOUR_OF_DAY=23,MINUTE=1,SECOND=45,MILLISECOND=878,ZONE_OFFSET=28800000,DST_OFFSET=0]
Calendar常用方法
public int get(int field) -> 取日期中的某个字段信息
public void set(int field,int value) -> 修改日历的某个字段信息
public void add(int field,int amount) -> 为某个字段增加/减少指定的值
public final Date getTime() -> 拿到此刻日期对象
public long getTimeInMillis() -> 拿到此刻时间毫秒值
JDK8新增日期类
LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳。
DateTimeFormatter 用于做时间的格式化和解析的
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
说明:新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改
LocalDate、LocalTime、LocalDateTime
类的实例是不可变的对象
构建对象和API都是通用的
构建对象方式
public static Xxxx now(); => 静态方法,根据当前时间创建对象
public static Xxxx of(…); => 静态方法,指定日期/时间创建对象
获取信息的API
public int getYear() -> 获取年
public int getMonthValue() -> 获取月份(1-12)
public int getDayOfMonth() -> 获取月中第几天
public int getDayOfMonth() -> 获取年中第几天
public DayOfWeek getDayOfWeek() -> 获取星期
修改相关的API
这些方法返回的是一个新的实例引用
plusDays, plusWeeks, plusMonths, plusYears
minusDays, minusWeeks, minusMonths, minusYears
withDayOfMonth, withDayOfYear, withMonth, withYear -> 将月份天数、年份天数、月份、年 份 修 改 为 指 定 的 值 并 返 回 新 的 LocalDate 对象
isBefore, isAfter
【例】
package com.test.d4_jdk8_time;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.MonthDay;
public class Demo04UpdateTime {
public static void main(String[] args) {
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);//当前时间
System.out.println(nowTime.minusHours(1));//一小时前
System.out.println("-----------------------------------");
System.out.println(nowTime.plusMinutes(1));//一分钟后
System.out.println("-----------------------------------");
// 不可变对象,每次修改产生新对象!
System.out.println(nowTime);
System.out.println("-----------------------------------");
LocalDate myDate = LocalDate.of(2016, 9, 5);
LocalDate nowDate = LocalDate.now();
System.out.println("今天是2016-09-06吗? " + nowDate.equals(myDate));//今天是2018-09-06吗? false
System.out.println(myDate + "是否在" + nowDate + "之前? " + myDate.isBefore(nowDate));//2018-09-05是否在2018-09-06之前? true
System.out.println(myDate + "是否在" + nowDate + "之后? " + myDate.isAfter(nowDate));//2018-09-05是否在2018-09-06之后? false
System.out.println("-----------------------------------");
// 判断今天是否是你的生日
LocalDate birDate = LocalDate.of(1996, 8, 5);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());
MonthDay nowMd = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗? " + birMd.equals(nowMd));//今天是你的生日吗? false
}
}
输出:
Instant时间戳
Instant类似JDK8以前的Date
Instant和Date这两个类可以进行转换
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();
【例】
package com.test.d4_jdk8_time;
import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
public class Demo05Instant {
public static void main(String[] args) {
// 1、得到一个Instant时间戳对象
Instant instant = Instant.now();
System.out.println(instant);
// 2、得到系统本时区的时间戳
Instant instant1 = Instant.now();
System.out.println(instant1.atZone(ZoneId.systemDefault()));
// 3、Instant对象返回Date对象
Date date = Date.from(instant);
System.out.println(date);
// 4、Date对象返回Instant对象
Instant i2 = date.toInstant();
System.out.println(i2);
}
}
输出:
DateTimeFormatter
JDK8引入,正反都能调用format方法
【例】
package com.test.d4_jdk8_time;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Demo06DateTimeFormat {
public static void main(String[] args) {
// 本地此刻 日期时间 对象
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// 解析/格式化器
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
// 正向格式化
System.out.println(dtf.format(ldt));
// 逆向格式化
System.out.println(ldt.format(dtf));
// 解析字符串时间
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析当前字符串时间成为本地日期时间对象
LocalDateTime ldt1 = LocalDateTime.parse("2019-11-11 11:11:11" , dtf1);
System.out.println(ldt1);
System.out.println(ldt1.getDayOfYear());
}
}
输出:
Period
使用java.time.Period计算日期间隔
主要是通过 Period 类方法 getYears(),getMonths() 和 getDays() 计算,只能精确到年月日,用于 LocalDate 之间的比较。
【例】
package com.test.d4_jdk8_time;
import java.time.LocalDate;
import java.time.Period;
public class Demo07Period {
public static void main(String[] args) {
// 当前本地 年月日
LocalDate today = LocalDate.now();
System.out.println(today);//
// 生日的 年月日
LocalDate birthDate = LocalDate.of(1998, 10, 13);
System.out.println(birthDate);
Period period = Period.between(birthDate, today);//第二个参数减第一个参数
System.out.println("年差值:" + period.getYears());
System.out.println("月差值:" +period.getMonths());
System.out.println("日差值:" +period.getDays());
}
}
输出:
2021-11-27
1998-10-13
年差值:23
月差值:1
日差值:14
Duration
使用java.time.Duration计算时间间隔
用于 LocalDateTime 或 Instant 之间的比较
【例】
package com.test.d4_jdk8_time;
import java.time.Duration;
import java.time.LocalDateTime;
public class Demo08Duration {
public static void main(String[] args) {
// 本地日期时间对象。
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 出生的日期时间对象
LocalDateTime birthDate = LocalDateTime.of(1998,10
,13,14,00,00);
System.out.println(birthDate);
Duration duration = Duration.between( today , birthDate);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
}
}
输出:
2021-11-27T14:00:41.006728600
1998-10-13T14:00
-8446
-202704
ChronoUnit
java.time.temporal.ChronoUnit工具类可用于在单个时间单位内测量一段时间,可以用于比较所有的时间单位
【例】
package com.test.d4_jdk8_time;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Demo09ChronoUnit {
public static void main(String[] args) {
// 本地日期时间对象:此刻的
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 生日时间
LocalDateTime birthDate = LocalDateTime.of(1998,10,1,
10,50,59);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
}
}
输出:
2021-11-27T14:04:27.018881300
1998-10-01T10:50:59
相差的年数:23
相差的月数:277
相差的周数:1208
相差的天数:8458
相差的时数:202995
相差的分数:12179713
相差的秒数:730782808


![[Java笔记13] 日期与时间 [Java笔记13] 日期与时间](http://www.mshxw.com/aiimages/31/606029.png)
