JDK8时间类
以下代码的各类导包:
import java.time.ZoneId; import java.util.Set; import java.time.Instant; import java.time.ZonedDateTime; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.time.format.DateTimeFormatter; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.time.MonthDay; import java.time.LocalDate; import java.time.LocalTime; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calendar;
获取时区信息
public static void main(String[] args) {
//获取所有时区的名称
Set<String> zoneIds= ZoneId.getAvailableZoneIds();
System.out.println(zoneIds.size());
System.out.println(zoneIds); //Asia/Shanghai
//获取系统的默认时区
ZoneId zoneId=ZoneId.systemDefault();
System.out.println(zoneId); //Asia/Shanghai
//获取一个指定时区
ZoneId zoneId1=ZoneId.of("Etc/GMT+9");
System.out.println(zoneId1);
}
获取某一时刻的时间对象 Instant类
public static void main(String[] args) {
/*
static 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) 增加时间系列的方法
*/
//获取当前时间的Instant对象(标准时间)
Instant now= Instant.now();
System.out.println(now); //2023-04-04T07:31:39.912326Z
//根据(秒/毫秒/纳秒)获取Instant对象
Instant instant1=Instant.ofEpochMilli(0L);
System.out.println(instant1); //1970-01-01T00:00:00Z
Instant instant2=Instant.ofEpochSecond(1l);
System.out.println(instant2); //1970-01-01T00:00:01Z
Instant instant3=Instant.ofEpochSecond(1l,1000000000l);
System.out.println(instant3); //1970-01-01T00:00:02Z
//指定时区
ZonedDateTime time=Instant.now().atZone(ZoneId.of("Asia/Shanghai"));
System.out.println(time); //2023-04-04T15:31:39.916325800+08:00[Asia/Shanghai]
//isXxx 判断
Instant instant4=Instant.ofEpochMilli(0L);
Instant instant5=Instant.ofEpochMilli(1000l);
boolean result1=instant4.isBefore(instant5); //判断instant4是否在instant5之前
System.out.println(result1); //true
System.out.println(instant4.isAfter(instant5)); //判断instant4是否在instant5之后 false
//
Instant instant6=Instant.ofEpochMilli(3000L);
System.out.println(instant6); //1970-01-01T00:00:03Z
Instant instant7=instant6.minusSeconds(1); //在instant6的时间上减去1s
System.out.println(instant7); //1970-01-01T00:00:02Z
}
获取带时区的时间对象 ZonedDateTime类
public static void main(String[] args) {
/*
static ZonedDateTime now() //获取当前时间的ZonedDateTime对象
static ZonedDateTime ofXxxx() //获取指定时间的ZonedDateTime对象
ZonedDateTime WITHxXX(时间) //修改时间系列的方法
ZonedDateTime minusXxx(时间) //减少时间
ZonedDateTime plusXxx(时间) //增加时间
*/
//获取当前时间对象(带时区)
ZonedDateTime zdt= ZonedDateTime.now();
System.out.println(zdt);
//获取指定的时间对象(带时区)
//年月时分秒纳秒方式指定
ZonedDateTime time1=ZonedDateTime.of(2023,10,1,11,
12,12,0, ZoneId.of("Asia/Shanghai"));
System.out.println(time1);
//通过Instant+时区的方式获取时间对象
Instant instant=Instant.ofEpochMilli(0L);
ZoneId zoneId=ZoneId.of("Asia/Shanghai");
ZonedDateTime time2=ZonedDateTime.ofInstant(instant,zoneId);
System.out.println(time2);
//withXxx 修改时间系列的方法
ZonedDateTime time3=time2.withYear(2000);
System.out.println(time3);
//减少或者增加时间
ZonedDateTime time4=time3.minusYears(1);
ZonedDateTime time5=time3.plusYears(1);
System.out.println(time4);
System.out.println(time5);
//JDK8增的时间对象都是不可变的
//如果我们修改了时间
//那么调用者是不会改变的,而是产生了一个新的时间
}
获取时间的日历对象 LocalDate(侧重于年月日)、LocalTime(侧重于时分秒)、LocalDateTime(年月日时分秒)
public static void main(String[] args) {
//获取当前时间的日历对象(包含年月日)
LocalDate nowDate= LocalDate.now();
System.out.println(nowDate); //2023-04-04
//获取指定的时间的日历对象
LocalDate ldDate=LocalDate.of(2023,1,1);
System.out.println("指定日期:"+ldDate); //指定日期:2023-01-01
//get方法获取日历中的每一个属性值
//获取年
int year=ldDate.getYear();
System.out.println(year); //2023
//获取月
Month m=ldDate.getMonth();
System.out.println(m); //JANUARY
System.out.println(m.getValue()); //获取数字的月 1
//获取日
System.out.println(ldDate.getDayOfMonth()); //1
//获取星期
DayOfWeek dayOfWeek=ldDate.getDayOfWeek();
System.out.println(dayOfWeek); //SUNDAY
System.out.println(dayOfWeek.getValue()); //获取星期的数字 7
//is开头的方法表示判断
System.out.println(ldDate.isBefore(nowDate)); //true
System.out.println(ldDate.isAfter(nowDate)); //false
//with开头的方法表示修改,只能修改年月日
LocalDate withLocalDate=ldDate.withYear(2000);
System.out.println(withLocalDate); //2000-01-01
//minus/plus 开头的方式表示减少/增加,只能对年月日修改
System.out.println(ldDate.minusYears(1)); //2022-01-01 对年修改
System.out.println(ldDate.plusMonths(2)); //2023-03-01 对月修改
//判断今天是否是你的生日
LocalDate birthday=LocalDate.of(2002,1,14);
LocalDate daynow=LocalDate.now();
//判断今年的月日是否和你的出生月日相同
//MonthDay 表示月日对象
MonthDay birMd=MonthDay.of(birthday.getMonthValue(),birthday.getDayOfMonth());
MonthDay nowMd=MonthDay.from(daynow);
System.out.println("今天是你生日吗"+birMd.equals(nowMd)); //今天是你生日吗false
}
public static void main(String[] args) {
//获取本地的日历对象(时分秒)
LocalTime lt=LocalTime.now();
System.out.println(lt);
int hour=lt.getHour();
int minute=lt.getMinute();
int second=lt.getSecond();
int nano=lt.getNano();
System.out.println("现在的时间是"+hour+": "+minute+": "+second);
System.out.println(LocalTime.of(8,10,20)); //08:10:20
//is系列、with、minus、plus和LocalDate一致
}
public static void main(String[] args) {
LocalDateTime nowDateTime= LocalDateTime.now();
System.out.println(nowDateTime);
//星期
System.out.println(nowDateTime.getDayOfWeek());
//月份
System.out.println(nowDateTime.getMonth());
//把LocalDateTime对象转化为LocalDate或者LocalTime对象
LocalDate ld= nowDateTime.toLocalDate();
LocalTime lt=nowDateTime.toLocalTime();
System.out.println(ld);
System.out.println(lt);
}
判断两个时间的间隔
用ChronoUnit方法
public static void main(String[] args) {
//当前时间
LocalDateTime today= LocalDateTime.now();
System.out.println(today);
//生日时间
LocalDateTime birthday=LocalDateTime.of(2002,1,14,0,30,12);
System.out.println(birthday);
long year= ChronoUnit.YEARS.between(birthday,today);
System.out.println(year); //相差的年份
System.out.println(ChronoUnit.MONTHS.between(birthday,today)); //相差的月份
System.out.println(ChronoUnit.WEEKS.between(birthday,today)); //相差的周数
System.out.println(ChronoUnit.DAYS.between(birthday,today)); //相差的天数
System.out.println(ChronoUnit.HOURS.between(birthday,today)); //相差的小时数
System.out.println(ChronoUnit.DECADES.between(birthday,today)); //相差的十年数
}
练习:
JDK7版本的Date类已经不再使用,有兴趣者可以自行学习
public static void main(String[] args) throws ParseException {
//用代码计算你活了多少天,用JDK7和JDK8方式来完成
//JDK7
//规则:只要对时间进行计算或者判断,都需要先获取当前时间的毫秒值
//计算出出生年月日的毫秒值
String birthday="2002年1月1日";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy年MM月dd日");
Date date=sdf.parse(birthday);
long birthdayTime=date.getTime();
//当前时间
long todayTime=System.currentTimeMillis();
//计算间隔多少天
long time=todayTime-birthdayTime;
System.out.println(time/1000/60/60/24); //7763
//JDK8
// Period Duration ChronoUnit
LocalDate today1= LocalDate.now();
LocalDate birthday1=LocalDate.of(2002,1,1);
long days= ChronoUnit.DAYS.between(birthday1,today1);
System.out.println(days); //7763
}
public static void main(String[] args) {
//判断任意一个年份是闰年还是平年
//一年366天或者2月份是29天是闰年
//用JDK7和JDK8的方式判断
//JDK7
//把时间设置为一年的3月1日
//再把日历往前减1天,判断是28号还是29号4
Calendar c= Calendar.getInstance();
c.set(2000,2,1); //2000年3月1日
//把日历往前减一天
c.add(Calendar.DAY_OF_MONTH,-1);
int day=c.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
//后一年的1月1号
//往前减一天,判断是366天还是365天
Calendar c1=Calendar.getInstance();
c.set(2001,0,1); //2001年1月1日
//把日期往前减一天
c.add(Calendar.DAY_OF_YEAR,-1);
int day2=c.get(Calendar.DAY_OF_YEAR);
System.out.println(day2);
//JDK8
//月份范围1~12
LocalDate day3=LocalDate.of(2000,3,1);
//往前减1天
LocalDate day4=day3.minusDays(1);
//获取这天是一个月中的几号
int day5=day4.getDayOfMonth();
System.out.println(day5);
//true闰年
//false平年
//JDK8的isLeapYear()方法可以直接判断是否为闰年
System.out.println(day3.isLeapYear());
}