目录
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的构造器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日历类创建日历对象的方法根据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]
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() -> 拿到此刻时间毫秒值
LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳。
DateTimeFormatter 用于做时间的格式化和解析的
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔
说明:新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改
类的实例是不可变的对象
构建对象和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); } }
输出:
DateTimeFormatterJDK8引入,正反都能调用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
使用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
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)