常用API-二
目录
时间与日期
Date
Date类概述
- Date类的对象在Java中代表的是当前所在系统的此刻日期时间。
Date的构造器
public Date() 创建一个Date对象,代表的是系统当前此刻日期时间。
Date的常用方法
public long getTime() 获取时间对象的毫秒值
public class DateDemo1 {
public static void main(String[] args) {
//1.创建一个Date类对象,代表系统此刻时间日期对象
Date d = new Date();
System.out.println(d);
//2.获取时间的毫秒值
long time = d.getTime();
System.out.println(time);
long time1 = System.currentTimeMillis();
System.out.println(time1);
}
}
output
Wed Jan 12 10:14:47 CST 2022
1641953687908
1641953687927
案例
- 请计算出当前时间往后走1小时121秒之后 的时间是多少。
//1.获取当前时间
Date d2 = new Date();
System.out.println(d2);
//2.获取当前时间毫秒值,再往后走1小时112秒
long time2 = System.currentTimeMillis();
time2 += (60 * 60 + 112) * 1000;
//3.将time2时间毫秒值转成当前对应的日期对象
// Date d3 = new Date(time2);
// System.out.println(d3);
Date d3 = new Date();
d3.setTime(time2);
System.out.println(d3);
时间毫秒值 -> 日期对象
构造器:public Date(long time) 说明:把时间毫秒值转换成Date时期对象
Date方法:public void setTime(long time) 说明:设置日期对象的时间为当前时间毫秒值对应的时间
SimpleDateFormat
SimpleDateFormat 类作用
- 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式
- 也可以把字符串的时间形式解析成日期对象。
SimpleDateFormat的构造器
构造器:public SimpleDateFormat() 说明:构造一个SimpleDateFormat,使用默认格式。
public SimpleDateFormat(String pattern) 说明:构造一个SimpleDateFormat,使用指定的格式。
SimpleDateFormat 的格式化方法
格式化方法:public final String format(Date date) 将日期格式化成日期/时间字符串
public final String format(Objecr time) 将时间毫秒值化成日期/时间字符串
public class SimpleDateFormatDemo1 {
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 time = System.currentTimeMillis() + 121 * 1000;
String rs1 = sdf.format(time);
System.out.println(rs1);
}
}
output:
Wed Jan 12 10:48:17 CST 2022
2022年01月12日 10:48:17 星期三 上午
-------------
2022年01月12日 10:50:18 星期三 上午
SimpleDateFormat解析字符串时间成为日期对象
解析方法:public Date parse(String source) 从给定的字符串的开始解析文本以生成日期
案例一
- 请计算出2022年01月12日11点11分11秒,往后走2天14小时49分06秒后的时间是多少。
package com.csl.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 请计算出2022年01月12日11点11分11秒,往后走2天14小时49分06秒后的时间是多少。
*/
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException {
//1.把字符串时间拿到时间中来
String dateStr = "2022年01月12日 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;
//格式化这个时间的毫秒值就是结果
String format = sdf.format(time);
System.out.println(format);
}
}
output:
2022年01月15日 02:00:17
总结
- SimpleDateFormat可以格式化哪些形式?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str1 = sdf.format(date);//日期对象
String str1 = sdf.format(time);//时间毫秒值
- SimpleDateFormat如何进行字符串时间的解析的?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = sdf.parse(("2022-01-12 11:11:11"));
案例二:秒杀活动
秒杀开始时间:2020年11月11日 0:0:0
秒杀结束时间 2020年11月11日 0:10:0
需求
- 小白下单并付款时间为:2020年11月11日 0:03:47
- 小黑下单并付款时间为: 2020年11月11日 0:10:11
- 用代码说明这两位同学有没有参加线上秒杀活动
分析
- 判断下单时间是否在开始到结束的范围内
- 把字符串形式的时间变成毫秒值
package com.csl.d2_simpledateformat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
//1.记录各自的时间
String startTime = "2020-11-11 00:00:00";
String endTime = "2020-11-11 00:10:00";
String xaioBai = "2020-11-11 00:03:55";
String xiaoHei = "2020-11-11 00:10:22";
//2.解析他们的时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = sdf.parse(startTime);
Date d2 = sdf.parse(endTime);
Date d3 = sdf.parse(xaioBai);
Date d4 = sdf.parse(xiaoHei);
//3.做判断
if (d3.after(d1) && d3.before(d2)){
System.out.println("小白秒杀成功,可以发货!");
}else {
System.out.println("小白秒杀失败!");
}
if (d4.after(d1) && d4.before(d2)){
System.out.println("小黑秒杀成功,可以发货!");
}else {
System.out.println("小黑秒杀失败!");
}
}
}
output:
小白秒杀成功,可以发货!
小黑秒杀失败!
Calendar
Calendar概述
- Calendar代表了系统此刻日期对应的日历对象。
- Calendar是一个抽象类,不能直接创建对象
Calendar常用方法
public class CalendarDemo {
public static void main(String[] args) {
//1.拿到系统此时日历对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);
//2.获取日历的信息。
int year = cal.get(Calendar.YEAR);
System.out.println(year);
int mm = cal.get(Calendar.MONTH) + 1;
System.out.println(mm);
//3.public void set(int filed,int value):修改日历的某个字段信息
cal.set(Calendar.HOUR,12);
System.out.println(cal);
//4.public void add(int filed,int amount):为某个字段增加/减少指定的值
//请问64天后是什么日期
cal.add(Calendar.DAY_OF_YEAR,64);
cal.add(Calendar.MINUTE,59);
//5.public final Date getTime():拿到此刻日期对象
Date d = cal.getTime();
System.out.println(d);
//6.public long getTimeMillis():拿到此刻时间毫秒值
long time = cal.getTimeInMillis();
System.out.println(time);
}
}
output:
java.util.GregorianCalendar[time=1641959614206,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=2022,MONTH=0,WEEK_OF_YEAR=3,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=12,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=53,SECOND=34,MILLISECOND=206,ZONE_OFFSET=28800000,DST_OFFSET=0]
2022
1
java.util.GregorianCalendar[time=?,areFieldsSet=false,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=2022,MONTH=0,WEEK_OF_YEAR=3,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=12,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=0,HOUR=12,HOUR_OF_DAY=11,MINUTE=53,SECOND=34,MILLISECOND=206,ZONE_OFFSET=28800000,DST_OFFSET=0]
Thu Mar 17 13:52:34 CST 2022
1647496354206
注意:calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。
JDK8新增日期类
概述、
概述
- 从Java8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:
- LocalDate:不包含具体时间的日期
- LocalTime:不包含日期的时间
- LocalDateTime:包含日期及时间
- Instant:代表的是时间戳
- DateTimeFormatter:用于做时间的格式化和解析的
- Duration:用于计算两个 “时间” 的间隔
- Period:用于计算两个 “日期“ 的间隔
- 新增的API严格区分了时刻、本地日期、本地时间、并且,对日期和时间进行运算更加方便
- 其次,新API的类型几乎全部都是不变类型(和String的使用类似),可以放心使用不必担心被修改
LocalTime/LocalDate/LocalDateTime
- 它们 分别表示时间、日期、时间和日期对象,它们的类的实例是不可变的对象。
- 它们三者的构建对象和API都是通用的
修改相关的API
- LocalDateTime 综合了LocalDate和LocalTime 里面的方法,所以下面只用LocalDate和LocalTime来举例
- 这些方法返回的是一个新的实例引用,因为LocalDateTime、LocalDate、LocalTime都是不可变的
| 方法名 | 说明 |
| plusDays,plusWeeks,plusMonth,plusYears | 向当前LocalDate对象添加几天、几周、几个月、几年 |
| minusDays,minusWeeks,minusMonth,minusYears | 从当前LocalDate对象减去几天、几周、几个月、几年 |
| withDayOfMonth,withDayOfYear,withMonth,withYear | 将月份天数、年份天数、月份、年份修改为指定的值并返回新的LocalDate对象 |
| isBefore,isAfter | 比较两个LocalDate |
package com.csl.d4_jdk8_api;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Month;
import java.time.MonthDay;
public class Demo01UpdateTime {
public static void main(String[] args) {
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);
System.out.println(nowTime.minusHours(1));
System.out.println(nowTime.minusMinutes(1));
System.out.println(nowTime.minusSeconds(1));
System.out.println(nowTime.minusNanos(1));
System.out.println("---------------");
System.out.println(nowTime.plusHours(1));
System.out.println(nowTime.plusMinutes(1));
System.out.println(nowTime.plusSeconds(1));
System.out.println(nowTime.plusNanos(1));
System.out.println("-------------");
//不可变对象,每次修改产生新的对象
System.out.println(nowTime);
System.out.println("-----------------");
LocalDate myDate = LocalDate.of(2018, 9, 5);
LocalDate nowDate = LocalDate.now();
System.out.println("今天是2018-09-05吗?" + nowDate.equals(myDate));
System.out.println(myDate + "是否在" + nowDate + "之前" + myDate.isBefore(nowDate));
System.out.println(myDate + "是否在" + nowDate + "之后" + myDate.isAfter(nowDate));
System.out.println("----------------");
//判断今天是否是你的生日
LocalDate birDate = LocalDate.of(1996, 1, 12);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMd = MonthDay.of(birDate.getMonthValue(), nowDate1.getDayOfMonth());
MonthDay nowMd = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗?" + birMd.equals(nowMd));
}
}
output:
14:24:56.480
13:24:56.480
14:23:56.480
14:24:55.480
14:24:56.479999999
---------------
15:24:56.480
14:25:56.480
14:24:57.480
14:24:56.480000001
-------------
14:24:56.480
-----------------
今天是2018-09-05吗?false
2018-09-05是否在2022-01-12之前true
2018-09-05是否在2022-01-12之后false
----------------
今天是你的生日吗?true
Instant
Instant时间戳
- JDK8获取时间戳特别简单,且功能更丰富,Instant类由一个静态的工厂方法now()可以返回当前时间戳
import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
public class InstantDemo1 {
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.如何去返回Date对象
Date date = Date.from(instant);
System.out.println(date);
Instant instant2 = date.toInstant();
System.out.println(instant2);
}
}
output:
2022-01-12T06:38:17.701Z
2022-01-12T14:38:17.784+08:00[Asia/Shanghai]
Wed Jan 12 14:38:17 CST 2022
2022-01-12T06:38:17.701Z
- 时间戳是包含日期和时间的,与Java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
- Instant和Date这两个类可以进行转换
DateTimeFormatter
- 在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter
- 正反都能调用format()方法。
package com.csl.datetimeformatter;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterDemo {
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("2022-01-12 11:11:11",dtf1);
System.out.println(ldt1);
System.out.println(ldt1.getDayOfYear());
}
}
output:
2022-01-12T14:54:02.490
2022-01-12 14:54:02 星期三 下午
2022-01-12 14:54:02 星期三 下午
2022-01-12T11:11:11
12
Duration/Period
Period
- 在Java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period
- 主要是Period类方法getYears(),getMonths(),getDays()来计算,只能精确到年月日
- 用于LocalDate之间比较
import java.time.LocalDate;
import java.time.Period;
public class Demo02Period {
public static void main(String[] args) {
//当前本地 年月日
LocalDate today = LocalDate.now();
System.out.println(today);
//生日的 年月日
LocalDate birDate = LocalDate.of(1996,12,12);
Period period = Period.between(birDate,today);//第二个参数减去第一个
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
output:
2022-01-12
25
1
0
Duration
- 在Java8中,我们可以使用以下类来计算时间间隔差异:java.time.Duration
- 提供了使用基于时间的值测量时间量的方法
- 用于LocalDateTime 之间的比较。也可用于Instant 之间的比较
package com.csl.d4_jdk8_api;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class Demo03Duration {
public static void main(String[] args) {
//本地日期时间对象
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
//出生日期时间对象
LocalDateTime birDate = LocalDateTime.of(1996,12,12,12,07,23);
Duration duration = Duration.between(birDate,today);
System.out.println(duration.toDays());
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
System.out.println(duration.toMillis());
System.out.println(duration.toNanos());
}
}
output:
2022-01-12T15:06:42.036
9162
219890
13193459
791607559036
791607559036000000
ChronoUnit
java.time.temporal.ChronoUnit
- ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可用于比较所有的时间单位
package com.csl.d4_jdk8_api;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class ChronoUnitDemo {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birDate = LocalDateTime.of(1996,12,12,12,05,01);
System.out.println(birDate);
System.out.println("相差的年数:"+ChronoUnit.YEARS.between(birDate, today));
System.out.println("相差的月数:"+ChronoUnit.MONTHS.between(birDate, today));
System.out.println("相差的周数:"+ChronoUnit.WEEKS.between(birDate, today));
System.out.println("相差的天数:"+ChronoUnit.DAYS.between(birDate, today));
System.out.println("相差的小时数:"+ChronoUnit.HOURS.between(birDate, today));
System.out.println("相差的分钟数:"+ChronoUnit.MINUTES.between(birDate, today));
System.out.println("相差的秒数:"+ChronoUnit.SECONDS.between(birDate, today));
System.out.println("相差的毫秒数:"+ChronoUnit.MILLIS.between(birDate, today));
System.out.println("相差的微秒数:"+ChronoUnit.MICROS.between(birDate, today));
System.out.println("相差的纳秒数:"+ChronoUnit.NANOS.between(birDate, today));
System.out.println("相差的半天数:"+ChronoUnit.HALF_DAYS.between(birDate, today));
System.out.println("相差的十年数:"+ChronoUnit.DECADES.between(birDate, today));
System.out.println("相差的世纪(百年)数:"+ChronoUnit.CENTURIES.between(birDate, today));
System.out.println("相差的千年数:"+ChronoUnit.MILLENNIA.between(birDate, today));
System.out.println("相差的纪元数:"+ChronoUnit.ERAS.between(birDate, today));
}
}
output:
2022-01-12T15:32:38.318
1996-12-12T12:05:01
相差的年数:25
相差的月数:301
相差的周数:1308
相差的天数:9162
相差的小时数:219891
相差的分钟数:13193487
相差的秒数:791609257
相差的毫秒数:791609257318
相差的微秒数:791609257318000
相差的纳秒数:791609257318000000
相差的半天数:18324
相差的十年数:2
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0