时间类Date(下)
JDK7时间类:SimpleDateFormat
作用:
- 格式化:把时间变成我们喜欢的格式
- 解析:把字符串表示的时间变成Date对象
构造方法 说明
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat,使用指定格式
常用方法 说明
public final String format(Date date) 格式化(日期对象-->字符串)
public Date parse(String source) 解析(字符串-->日期对象)
代码演示:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo2 {
public static void main(String[] args) throws ParseException {
/*构造方法 说明
public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat,使用指定格式
常用方法 说明
public final String format(Date date) 格式化(日期对象-->字符串)
public Date parse(String source) 解析(字符串-->日期对象)*/
//1.默认格式
SimpleDateFormat sdf1=new SimpleDateFormat();
Date d=new Date(0L);
String str1 = sdf1.format(d);
System.out.println(str1);
//2.指定格式
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str2 = sdf2.format(d);
System.out.println(str2);
//3.练习:yyyy年MM月dd日 HH:mm:ss 星期
SimpleDateFormat sdf3=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EE");
String str3 = sdf3.format(d);
System.out.println(str3);
//4.演示 解析(字符串-->日期对象)
String str="2022-10-19 23:39:52";
SimpleDateFormat sdf4=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d2 = sdf4.parse(str);
System.out.println(d2);
}
}
中间最后一个方法涉及异常的知识还没学,直接用idea自带的解决方式解决即可。
练习1:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test1 {
public static void main(String[] args) throws ParseException {
//假设,你的出生年月日为:2002-8-24(随意输的)
//请用字符串表示这个数据,并将其转换为:2000年11月11日
//建议逆推
//1.先把2002-8-24解析为日期对象
String str="2002-8-24";
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");
Date d= sdf1.parse(str);
//2.再把日期对象格式化
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy年MM月dd日");
String result = sdf2.format(d);
System.out.println(result);
}
}
练习2:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test2 {
public static void main(String[] args) throws ParseException {
//秒杀活动
//秒杀开始时间:2023年11月11日 0:00:00
//秒杀结束时间:2023年11月11日 0:10:00
//小贾下单并付款的时间为:2022年11月11日 0:01:00
//小皮下单并付款的时间为:2022年11月11日 0:11:00
//需求:用代码说明这两位同学有没有参加上秒杀活动
//比较两个时间,我们要获取到他们的毫秒值
String startStr="2023年11月11日 0:00:00";
String endStr="2023年11月11日 0:10:00";
String orderStr="2022年11月11日 0:11:00";
//解析上面的时间获取date对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date dateStart = sdf.parse(startStr);
Date dateEnd = sdf.parse(endStr);
Date dateOrder = sdf.parse(orderStr);
//得到三个时间对应的毫秒值
long startTime = dateStart.getTime();
long endTime = dateEnd.getTime();
long orderTime = dateOrder.getTime();
//判断:
if (orderTime>=startTime&&orderTime<=endTime){
System.out.println("参加成功");
}
else{
System.out.println("参加失败");
}
}
}
JDK7时间类:Calendar
- Calendar代表了系统当前时间的日历对象,可以单独修改,获取时间中的年,月,日
- 细节:Calendar是一个抽象类,不能直接创建对象
获取Calendar日历类对象的方法
public static Calendar getInstance() 获取但钱时间的日历对象
常见的方法
public final Date getTime() 获取日期对象
public final setTime(Date date) 给日历设置日期对象
public long getTimeInMillis() 拿到时间毫秒值
public void serTimeInmillis(long millis) 给日历设置时间毫秒值
public int get(int field) 取日历的某个字段信息
public void set(int field,int value) 修改日历的某个字段信息
public void add(int filed,int amount) 为某个字段增加/减少指定的值
代码演示:
import java.util.Calendar;
import java.util.Date;
public class Demo3 {
public static void main(String[] args) {
/* public final Date getTime () 获取日期对象
public final setTime(Date date) 给日历设置日期对象
public long getTimeInMillis () 拿到时间毫秒值
public void serTimeInmillis ( long millis)给日历设置时间毫秒值
public int get ( int field)取日历的某个字段信息
public void set ( int field, int value)修改日历的某个字段信息
public void add ( int filed, int amount)为某个字段增加 / 减少指定的值*/
//1.获取日历对象
//细节1:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
Calendar c = Calendar.getInstance();
//底层原理
//会根据系统的不同时区来获取不同的日历对象,默认表示当前时间
//会把时间中的纪元,年,月,日,时,分,秒,星期,等等都放到一个数组中
System.out.println(c);
//2.修改日历所代表的时间
//细节2:
//月份:范围0-11 如果获取出来的是0,代表1月
//星期在老外眼里,星期日是一周中第一天
Date d=new Date(0L);
c.setTime(d);
System.out.println(c);
/*public int get ( int field)取日历的某个字段信息
public void set ( int field, int value)修改日历的某个字段信息
public void add ( int filed, int amount)为某个字段增加 / 减少指定的值*/
/*c.set(Calendar.YEAR,2000);
c.set(Calendar.MONTH,5);
c.set(Calendar.DAY_OF_YEAR,7);
c.add(Calendar.DAY_OF_YEAR,10);*/
//取日历的某个字段信息
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH)+1;
int date=c.get(Calendar.DAY_OF_YEAR);
int week=c.get(Calendar.DAY_OF_WEEK);
System.out.println(year+","+month+","+date+","+getWeek(week));
}
private static String getWeek(int index) {
String []arr={"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return arr[index];
}
}
JDK8时间类-时区,时间和格式化
- JDK8新增时间的相关类
ZoneId:时区
Instant:时间戳
ZoneDateTime:带时区的时间
DateTimeFormatter:用于时间的格式化和解析
LocalDate:年,月,日
LocalTime:时,分,秒
LocalDateTime:年,月,日,时,分,秒
Duration:时间间隔(秒,纳秒)
Period:时间间隔(年,月,日)
ChronoUnit:时间间隔(所有单位)
- Date类:ZoneId:时区 Instant:时间戳 ZoneDateTime:带时区的时间
- 日期格式化类:SimpleDateFormat:DateTimeFormatter:用于时间的格式化和解析
- 日历类:LocalDate:年,月,日 LocalTime:时,分,秒 LocalDateTime:年,月,日,时,分,秒
- 工具类:Duration:时间间隔(秒,纳秒) Period:时间间隔(年,月,日) ChronoUnit:时间间隔(所有单位)
- ZoneId:时区
public Set
static ZoneId systemDefault() 获取系统默认的时区
static ZoneId of(String zoneId) 获取一个指定的时区
import java.time.ZoneId;
import java.util.Set;
public class Demo4 {
public static void main(String[] args) {
/*public Set<String> getAvailableZoneIds () 获取Java中支持的所有时区
static ZoneId systemDefault () 获取系统默认的时区
static ZoneId of (String zoneId)获取一个指定的时区*/
//1.获取所有时区名称
Set<String> zoneIds= ZoneId.getAvailableZoneIds();
System.out.println(zoneIds);
System.out.println(zoneIds.size());//600
//2.获取系统默认的时区
ZoneId zoneId=ZoneId.systemDefault();
System.out.println(zoneId);
ZoneId zoneId1= ZoneId.of("Asia/Aden");
System.out.println(zoneId1);
}
}
- Instant时间戳
public Instant now() 获取当前的Instant对象(标准时间)
static Instant ofXxxx(long epochMilli) 根据(秒,毫秒,纳秒)获取Instant对象
ZonedDateTime atZone(ZoneId zone) 指定时区
boolean isXxx(Instant otherInstant) 判断系列的方法
Instant minusXxx(long millisToSubtract) 减少时间系列的方法
Instant plusXxx(long millisToSubtract) 增加时间系列的方法
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Demo5 {
public static void main(String[] args) {
/* public Instant now () 获取当前的Instant对象(标准时间)
static Instant ofXxxx ( long epochMilli)根据(秒,毫秒,纳秒) 获取Instant对象
ZonedDateTime atZone (ZoneId zone)指定时区
boolean isXxx (Instant otherInstant)判断系列的方法
Instant minusXxx ( long millisToSubtract)减少时间系列的方法
Instant plusXxx ( long millisToSubtract)增加时间系列的方法*/
//1.获取当前时间的Instant对象(标准时间)
Instant now=Instant.now();
System.out.println(now);
//2.根据(秒,毫秒,纳秒) 获取Instant对象
Instant instant1=Instant.ofEpochMilli(0L);
System.out.println(instant1);
Instant instant2=Instant.ofEpochSecond(1L);
System.out.println(instant2);
Instant instant3=Instant.ofEpochSecond(1L,1000000000L);
System.out.println(instant3);
//3.指定时区
ZonedDateTime time=Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(time);
//4.
//boolean isXxx (Instant otherInstant)判断系列的方法
//Instant minusXxx ( long millisToSubtract)减少时间系列的方法
//Instant plusXxx ( long millisToSubtract)增加时间系列的方法
Instant instant4=Instant.ofEpochMilli(0L);
Instant instant5=Instant.ofEpochMilli(1000L);
boolean flag=instant4.isBefore(instant5);
System.out.println(flag);
//isBefore表示在之前 isAfter在之后
Instant instant6=Instant.ofEpochMilli(3000L);
System.out.println(instant6.minusMillis(3000L));
Instant instant7=Instant.ofEpochMilli(3000L);
System.out.println(instant7.plusMillis(3000L));
}
}
- ZoneDateTime:带时区的时间
static ZoneDateTime now() 获取当前时间的ZoneDateTime对象
static ZoneDateTime ofXxx(...) 获取指定时间的ZoneDateTime对象
ZoneDateTime withXxx(时间) 修改时间系列的方法
ZoneDateTime miusXxx(时间) 减少时间系列的方法
ZoneDateTime plusXxx(时间) 增加时间系列的方法
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Demo6 {
public static void main(String[] args) {
/*static ZoneDateTime now () 获取当前时间的ZoneDateTime对象
static ZoneDateTime ofXxx (...)获取指定时间的ZoneDateTime对象
ZoneDateTime withXxx (时间) 修改时间系列的方法
ZoneDateTime miusXxx (时间) 减少时间系列的方法
ZoneDateTime plusXxx (时间) 增加时间系列的方法*/
//1.获取当前时间对象(带时区)
ZonedDateTime now=ZonedDateTime.now();
System.out.println(now);
//2.获取当前时间对象(带时区)
//年月日时分秒纳秒方指定
ZonedDateTime time1=ZonedDateTime.of(2023,10,1,11,12,12,0, ZoneId.of("Asia/Shanghai"));
System.out.println(time1);
//修改,减少,增加就不做演示了
}
- DateTimeFormatter:用于时间的格式化和解析
static DateTimeFormatter ofPattern(格式) 获取格式对象
String format(时间对象) 按照指定格式格式化
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Demo7 {
public static void main(String[] args) {
/*static DateTimeFormatter ofPattern (格式) 获取格式对象
String format (时间对象) 按照指定格式格式化*/
//获取时间对象
ZonedDateTime time= Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
//格式化
DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EE a");
System.out.println(dtf.format(time));
}
}
JDK8时间类-日历和工具类
- 日历类
LocalDate:年,月,日
LocalTime:时,分,秒
LocalDateTime:年,月,日,时,分,秒
static XXX now() 获取当前时间的对象
static XXX of(...) 获取指定时间的对象
get开头的方法 获取日历中年,月,日,时,分,秒等信息
isBefore,isAgter 比较两个LocalDate
with开头的 修改
minus开头的 减少
plus开头的 增加
因为LocalDateTime是LocalDate和LocalTime的总和,还提供了转为LocalDate和LocalTime的方法
public LocalDate toLocalDate() public LocalDate toLocalTime()
这里就不做具体演示了,可参考之间的代码。
- 工具类:
- Duration:时间间隔(秒,纳秒)
- Period:时间间隔(年,月,日)
- ChronoUnit:时间间隔(所有单位)
import java.time.Duration;
import java.time.LocalDateTime;
public class Demo8 {
public static void main(String[] args) {
//获取本地时间对象
LocalDateTime today=LocalDateTime.now();
System.out.println(today);
//出生日期的时间对象
LocalDateTime birthday=LocalDateTime.of(2002,8,24,0,0,0);
System.out.println(birthday);
Duration duration=Duration.between(birthday,today);//第二个参数减去第一个
System.out.println(duration);
System.out.println("==================");
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());//纳秒数差
}