文章目录
- JDK7以前时间相关类
- Date 时间类
- 阅读源码
- 练习
- SimpleDateFormat 格式化时间
- 作用
- 构造方法
- 常用方法
- 日期和时间模式
- 练习
- Calendar 日历
- 获取Calendar对象的方法
- Calendar常用方法
- JDK8新增时间相关类
- 变化
- Date类
- ZoneId:时区
- Instant:时间戳
- ZoneDateTime:带时区的时间
- 日期格式化类:SimpleDateFormat
- DateTimeFormatter:用于时间的格式化和解析
- 日历类:Calendar
- LocalDate、LocalTime、LocalDateTime方法
- LocalDate、LocalTime、LocalDateTime之间的转换
- 判断生日
- 工具类
- Duration:时间间隔(秒、纳秒)
- Period:时间间隔(年、月、日)
- ChronoUnit:时间间隔(所有单位)
JDK7以前时间相关类
Date 时间类
阅读源码
import java.util.Date;
public class test13 {
public static void main(String[] args) {
//空参构造
Date date1=new Date();
System.out.println(date1); //Sat Jan 06 16:08:25 CST 2024
//有参构造
Date date2=new Date(0L);
System.out.println(date2); //Thu Jan 01 08:00:00 CST 1970 —— 东八区在0的基础上加8个小时
//修改时间,传递的参数为毫秒
date2.setTime(1000L);
System.out.println(date2); //Thu Jan 01 08:00:01 CST 1970 —— 1000ms=1s
//获取时间的毫秒值
System.out.println(date2.getTime()); //1000
}
}
练习
需求1:打印时间原点开始一年之后的时间
import java.util.Date;
public class test14 {
public static void main(String[] args) {
Date date=new Date(0L);
long time=365*24*60*60*1000L;
date.setTime(time);
System.out.println(date); //Fri Jan 01 08:00:00 CST 1971
}
}
import java.util.Date;
public class test14 {
public static void main(String[] args) {
Date date=new Date(0L);
long time=date.getTime();
time+=365*24*60*60*1000L;
date.setTime(time);
System.out.println(date); //Fri Jan 01 08:00:00 CST 1971
}
}
需求2:定义任意两个Date对象,比较哪个时间在前,哪个时间在后
import java.util.Date;
import java.util.Random;
public class test15 {
public static void main(String[] args) {
Random random = new Random();
Date date1 = new Date(Math.abs(random.nextInt()));
Date date2 = new Date(Math.abs(random.nextInt()));
long time1 = date1.getTime();
long time2 = date2.getTime();
if (time1 < time2) {
System.out.println("date1时间在前");
} else if (time1 > time2) {
System.out.println("date2时间在前");
} else {
System.out.println("date1和date2时间相同");
}
}
}
SimpleDateFormat 格式化时间
作用
- 格式化:把时间变成想要的格式
- 解析:把字符串表示的时间变成Date对象
构造方法
常用方法
日期和时间模式
import java.text.SimpleDateFormat;
import java.util.Date;
public class test16 {
public static void main(String[] args) {
SimpleDateFormat sdf1=new SimpleDateFormat();
Date date=new Date(0L);
String str1=sdf1.format(date);
System.out.println(str1); //70-1-1 上午8:00
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str2=sdf2.format(date);
System.out.println(str2); //1970年01月01日 08:00:00
SimpleDateFormat sdf3=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
String str3=sdf3.format(date);
System.out.println(str3); //1970年01月01日 08:00:00 星期四
}
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class test17 {
public static void main(String[] args) throws ParseException {
String str="2002-11-20 14:13:55";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date); //Wed Nov 20 14:13:55 CST 2002
}
}
练习
需求1:
假设,你的猪的出生年月日为:2000-09-26,请用字符串表示这个数据,并将其转换为:2000年09月26日
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class test18 {
public static void main(String[] args) throws ParseException {
//假设,你猪的出生年月日为:2000-09-26,请用字符串表示这个数据,并将其转换为:2000年09月26日
String str = "2000-09-26";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf1.parse(str);
SimpleDateFormat sdf2=new SimpleDateFormat("yyyy年MM月dd日");
String result = sdf2.format(date);
System.out.println(result);
}
}
需求2:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class test19 {
public static void main(String[] args) throws ParseException {
String time1 = "2023年11月11日 0:01:00";
String time2 = "2023年11月11日 0:11:0";
String start = "2023年11月11日 0:0:0";
String end = "2023年11月11日 0:10:0";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date time1_date = sdf.parse(time1);
Date time2_date = sdf.parse(time2);
Date start_date = sdf.parse(start);
Date end_date = sdf.parse(end);
long time1_time = time1_date.getTime();
long time2_time = time2_date.getTime();
long start_time = start_date.getTime();
long end_time = end_date.getTime();
if (time1_time >= start_time && time1_time <= end_time) {
System.out.println("小贾下单成功!");
} else {
System.out.println("小贾下单失败!");
}
if (time2_time >= start_time && time2_time <= end_time) {
System.out.println("小皮下单成功!");
} else {
System.out.println("小皮下单失败!");
}
}
}
Calendar 日历
Calendar代表系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日。
注意:Calendar是一个抽象类,不能直接创建对象。
获取Calendar对象的方法
Calendar常用方法
import java.util.Calendar;
import java.util.Date;
public class test20 {
public static void main(String[] args) {
//底层原理:会根据系统的不同时区返回不同的日历对象
//把相关的信息放在一个数组当中
Calendar calendar=Calendar.getInstance();
//月份:范围0~11,MONTH=0是1月
//星期:1是星期天,DAY_OF_WEEK=1是星期天
System.out.println(calendar);
// java.util.GregorianCalendar[time=1704565565855,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=2024,MONTH=0,WEEK_OF_YEAR=2,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=7,DAY_OF_WEEK=1,
// DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=26,SECOND=5,MILLISECOND=855,
// ZONE_OFFSET=28800000,DST_OFFSET=0]
//修改日历代表时间
Date date=new Date(0L);
calendar.setTime(date);
System.out.println(calendar);
// java.util.GregorianCalendar[time=0,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=1970,MONTH=0,
// WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=0,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
//修改日历毫秒值
calendar.setTimeInMillis(1000L);
System.out.println(calendar);
// java.util.GregorianCalendar[time=1000,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=1970,MONTH=0,
// WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=1,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
//获取日历信息
System.out.println(calendar.get(Calendar.YEAR)); //1970
System.out.println(calendar.get(Calendar.MONTH)); //0
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //1
//修改日历中指定信息的值
calendar.set(Calendar.YEAR,2024);
System.out.println(calendar);
//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=2024,MONTH=0,
// WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=1,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
//某个字段增加指定值
calendar.add(Calendar.YEAR,+5);
System.out.println(calendar);
// 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=2029,MONTH=0,
// WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=1,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
//某个字段减少指定值
calendar.add(Calendar.YEAR,-10);
System.out.println(calendar);
// 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=2019,MONTH=0,
// WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=1,
// AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=1,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
}
}
JDK8新增时间相关类
变化
Date类
ZoneId:时区
import java.time.ZoneId;
import java.util.Set;
public class test21 {
public static void main(String[] args) {
// 获取所有时区名称
Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println(availableZoneIds);
System.out.println(availableZoneIds.size()); //603
// 获取当前系统时区
ZoneId systemDefault = ZoneId.systemDefault();
System.out.println(systemDefault); //Asia/Shanghai
// 获取指定时区
ZoneId zoneId = ZoneId.of("America/Marigot");
System.out.println(zoneId); //America/Marigot
}
}
Instant:时间戳
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class test22 {
public static void main(String[] args) {
// 获取世界标准时间
Instant now = Instant.now();
System.out.println(now); //2024-01-06T19:24:29.595Z
// 获取当前东八区时间
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime now_eight=now.atZone(zoneId);
System.out.println(now_eight); //2024-01-07T03:24:29.595+08:00[Asia/Shanghai]
// 根据毫秒获取Instant对象
Instant ofEpochMilli = Instant.ofEpochMilli(1000L);
System.out.println(ofEpochMilli); //970-01-01T00:00:01Z
// 根据秒获取Instant对象
Instant ofEpochSecond = Instant.ofEpochSecond(40);
System.out.println(ofEpochSecond); //1970-01-01T00:00:40Z
// 根据秒+纳秒获取Instant对象
Instant ofEpochSecond1 = Instant.ofEpochSecond(20, 20); //1970-01-01T00:00:20.000000020Z
System.out.println(ofEpochSecond1);
// 判断前后
Instant instant1=Instant.ofEpochMilli(1000L);
Instant instant2=Instant.ofEpochMilli(2000L);
boolean result1=instant1.isAfter(instant2); //false
boolean result2=instant1.isBefore(instant2); //true
System.out.println(result1);
System.out.println(result2);
// 减少/增加
Instant instant3=Instant.ofEpochMilli(3000L);
Instant instant4=Instant.ofEpochMilli(4000L);
Instant instant5=instant3.minusMillis(1000L);
Instant instant6=instant4.plusMillis(1000L);
System.out.println(instant3); //1970-01-01T00:00:03Z
System.out.println(instant4); //1970-01-01T00:00:04Z
System.out.println(instant5); //1970-01-01T00:00:02Z
System.out.println(instant6); //1970-01-01T00:00:05Z
}
}
ZoneDateTime:带时区的时间
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class test23 {
public static void main(String[] args) {
// 获取当前带时区的时间
ZonedDateTime zdt=ZonedDateTime.now();
System.out.println(zdt); //2024-01-07T13:54:13.668+08:00[Asia/Shanghai]
// 获取指定时间
ZonedDateTime zonedDateTime=ZonedDateTime.of(2024,1,7,13,50,33,20, ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime); //2024-01-07T13:50:33.000000020+08:00[Asia/Shanghai]
// 通过Instant+时区获取指定时间
Instant instant=Instant.ofEpochMilli(1000L);
ZoneId zoneId=ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime10 = instant.atZone(zoneId);
System.out.println(zonedDateTime10); //1970-01-01T08:00:01+08:00[Asia/Shanghai]
// 修改时间
ZonedDateTime zonedDateTime1 = zonedDateTime.withYear(2019);
ZonedDateTime zonedDateTime2 = zonedDateTime.withMonth(9);
ZonedDateTime zonedDateTime3 = zonedDateTime.withDayOfMonth(26);
System.out.println(zonedDateTime); //2024-01-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime1); //2019-01-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime2); //2024-09-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime3); //2024-01-26T13:50:33.000000020+08:00[Asia/Shanghai]
// 减少时间
ZonedDateTime zonedDateTime4 = zonedDateTime.minusYears(4);
ZonedDateTime zonedDateTime5 = zonedDateTime.minusMonths(2);
ZonedDateTime zonedDateTime6 = zonedDateTime.minusDays(4);
System.out.println(zonedDateTime4); //2020-01-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime5); //2023-11-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime6); //2024-01-03T13:50:33.000000020+08:00[Asia/Shanghai]
// 增加时间
ZonedDateTime zonedDateTime7 = zonedDateTime.plusYears(10);
ZonedDateTime zonedDateTime8 = zonedDateTime.plusMonths(4);
ZonedDateTime zonedDateTime9 = zonedDateTime.plusDays(10);
System.out.println(zonedDateTime7); //2034-01-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime8); //2024-05-07T13:50:33.000000020+08:00[Asia/Shanghai]
System.out.println(zonedDateTime9); //2024-01-17T13:50:33.000000020+08:00[Asia/Shanghai]
}
}
日期格式化类:SimpleDateFormat
DateTimeFormatter:用于时间的格式化和解析
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class test24 {
public static void main(String[] args) {
// 获取格式对象
DateTimeFormatter stf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 获取时间对象
ZonedDateTime zonedDateTime = Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
// 格式化时间对象
String format = stf.format(zonedDateTime);
System.out.println(format); //2024-01-07 14:19:12
}
}
日历类:Calendar
LocalDate、LocalTime、LocalDateTime方法
LocalDate、LocalTime、LocalDateTime之间的转换
import java.time.*;
public class test25 {
public static void main(String[] args) {
// LocalDate
// 获取当前时间
LocalDate localDate=LocalDate.now();
System.out.println(localDate); //2024-01-07
LocalDateTime localDateTime1 = localDate.atStartOfDay();
System.out.println(localDateTime1); //2024-01-07T00:00
// 获取日历中指定信息
int year = localDate.getYear();
Month month = localDate.getMonth();
int month1=month.getValue();
int dayOfMonth = localDate.getDayOfMonth();
System.out.println(year); //2024
System.out.println(month); //JANUARY
System.out.println(month1); //1
System.out.println(dayOfMonth); //7
// 比较时间前后
LocalDate localDate1=LocalDate.of(2022,11,20);
boolean after = localDate.isAfter(localDate1);
boolean before = localDate.isBefore(localDate1);
System.out.println(after); //true
System.out.println(before); //false
// 修改日历信息
LocalDate localDate2 = localDate1.withYear(2023);
LocalDate localDate3 = localDate1.withMonth(12);
LocalDate localDate4 = localDate1.withDayOfMonth(29);
System.out.println(localDate2); //2023-11-20
System.out.println(localDate3); //2022-12-20
System.out.println(localDate4); //2022-11-29
// LocalTime
LocalTime localTime=LocalTime.now(); //14:29:51.394
LocalTime localTime1 = LocalTime.now(ZoneId.of("America/Cuiaba")); //02:29:51.394
System.out.println(localTime);
System.out.println(localTime1);
// LocalDateTime
LocalDateTime localDateTime=LocalDateTime.now();
LocalDateTime localDateTime5=LocalDateTime.now(ZoneId.of("America/Cuiaba"));
System.out.println(localDateTime); //2024-01-07T14:31:12.884
System.out.println(localDateTime5); //2024-01-07T02:31:12.884
// 转换
LocalDate localDate5 = localDateTime.toLocalDate();
LocalTime localTime2 = localDateTime.toLocalTime();
System.out.println(localDate5); //2024-01-07
System.out.println(localTime2); //14:44:20.837
}
}
判断生日
import java.time.LocalDate;
import java.time.MonthDay;
public class test26 {
public static void main(String[] args) {
LocalDate birth=LocalDate.of(2002,11,20);
LocalDate now=LocalDate.now();
MonthDay birthMonthDay=MonthDay.of(birth.getMonthValue(),birth.getDayOfMonth());
MonthDay nowMonthDay=MonthDay.of(now.getMonthValue(),now.getDayOfMonth());
if(birthMonthDay.equals(nowMonthDay)){
System.out.println("今天生日!");
}
}
}
工具类
Duration:时间间隔(秒、纳秒)
import java.time.Duration;
import java.time.LocalTime;
public class test28 {
public static void main(String[] args) {
// Duration
LocalTime now=LocalTime.now();
LocalTime localTime=LocalTime.of(12,0,0);
Duration duration=Duration.between(localTime,now);
System.out.println(duration); //PT3H4M39.451S
System.out.println(duration.toDays()); //0
System.out.println(duration.toHours()); //3
System.out.println(duration.toMinutes()); //184
System.out.println(duration.toMillis()); //11079451
System.out.println(duration.toNanos()); //11079451000000
}
}
Period:时间间隔(年、月、日)
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
public class test27 {
public static void main(String[] args) {
// Period
LocalDate now=LocalDate.now();
LocalDate birth=LocalDate.of(2002,11,20);
Period period=Period.between(birth,now); //第二个参数减去第一个参数
System.out.println(period); //P21Y1M18D
System.out.println(period.getYears()); //21
System.out.println(period.getMonths()); //1
System.out.println(period.getDays()); //18
System.out.println(period.toTotalMonths()); //253
}
}
ChronoUnit:时间间隔(所有单位)
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class test29 {
public static void main(String[] args) {
LocalDateTime now=LocalDateTime.now();
LocalDateTime localDateTime=LocalDateTime.of(2022,11,20,12,54,30);
System.out.println(ChronoUnit.YEARS.between(localDateTime,now)); //1
System.out.println(ChronoUnit.MONTHS.between(localDateTime,now)); //13
System.out.println(ChronoUnit.DAYS.between(localDateTime,now)); //413
System.out.println(ChronoUnit.HOURS.between(localDateTime,now)); //9914
System.out.println(ChronoUnit.MINUTES.between(localDateTime,now)); //594855
System.out.println(ChronoUnit.SECONDS.between(localDateTime,now)); //35691339
}
}