文章目录
- 1、Calendar
- 1.1 Calendar日历对象
- 2、JDK8 之后新增的时间类
- 2.1 LocalDate、LocalTime 、LocalDateTime
- 2.2 ZoneId 、ZoneIdTime
- 2.3 Instant
- 2.4 DateTimeFormatter
- 2.5 Period
- 2.6 Duration
1、Calendar
在了解calendar之前,先用SimpleDateFormat 写一个小例子
String start="2023年11月11日 0:0:0";
String end="2023年11月11日 0:10:0";
String xj="2023年11月11日 0:01:18";
String xp="2023年11月11日 0:10:57";
//把字符串转换为日期对象
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date startdate = simpleDateFormat.parse(start);
Date enddate = simpleDateFormat.parse(end);
Date xjdate = simpleDateFormat.parse(xj);
Date xpdate = simpleDateFormat.parse(xp);
long startl = startdate.getTime();
//获得毫秒值
long endl = enddate.getTime();
long xjl = xjdate.getTime();
long xpl = xpdate.getTime();
//进行判断
if(xjl>=startl&&xjl<=endl){
System.out.println("恭喜您秒杀成功~~");//执行
}
else {
System.out.println("恭喜您秒杀失败~~");
}
if(xpl>=startl&&xpl<=endl){
System.out.println("恭喜您秒杀成功~~");
}
else {
System.out.println("恭喜您秒杀失败~~");//执行
}
1.1 Calendar日历对象
如果我们想要改变当前日期,改变年/月/日 如果使用日期对象就比较麻烦 需要先转为日期对象 再获得毫秒值 再相加 再转为data对象。
使用Calendar就比较方便
注意
:Calendar是一个抽象类 我们不能实例化,但是我们可以通过Calendar.getInstance()方法获得一个calendar对象。
常用方法:
Calendar instance = Calendar.getInstance();
//可以直接获得calendar中的信息 包括年月日等 月份从0开始 要想获得正确月份 要+1
System.out.println(instance);
//java.util.GregorianCalendar[time=1710061551229,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=2,WEEK_OF_YEAR=11,WEEK_OF_MONTH=3,DAY_OF_MONTH=10,DAY_OF_YEAR=70,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=5,SECOND=51,MILLISECOND=229,ZONE_OFFSET=28800000,DST_OFFSET=0]
//获得Date对象
Date time = instance.getTime();
System.out.println(time);//Sun Mar 10 17:04:28 CST 2024
//获取毫秒值
System.out.println(instance.getTimeInMillis());//1710061468899
//获得当前属于该月的第一几天
int i = instance.get(Calendar.DATE);// 10
System.out.println(i);
//修改某个月
instance.set(Calendar.YEAR,2000);
//一旦修改 后续的日历对象都会被修改 不会保存原来的值了
System.out.println(instance);
//增加1年
instance.add(Calendar.YEAR,1);
System.out.println(instance);
//减少一年
instance.add(Calendar.YEAR,-1);
System.out.println(instance);
Date time1 = instance.getTime();
System.out.println(time1);//Fri Mar 10 17:04:28 CST 2000
2、JDK8 之后新增的时间类
为什么要学新增的时间类?
1、jdk8之前的时间类很多都被淘汰了,且使用不方便
2、线程不安全
3、都是毫秒级,没有纳秒级,不够准确
4、都是可变对象,不能保存之前的
比如
Date date=new Date();
System.out.println(date.getYear());//124
它的源代码:
public int getYear() {
return normalize().getYear() - 1900;
}
//我们可以看出来 必须要+1900才是现在的年份
2.1 LocalDate、LocalTime 、LocalDateTime
常用方法其实是差不多的,只不过是含有的内容不同
//获得当前的date
LocalDate localDate=LocalDate.now();
System.out.println(localDate);//2024-03-10
//获得具体的年月日等信息 get...
System.out.println(localDate.getMonth().getValue());//3
System.out.println(localDate.getYear());//2024
System.out.println(localDate.getDayOfMonth());//10
//修改某个信息 并且会返回新的对象 原始对象仍然保存 with...
LocalDate localDate1 = localDate.withDayOfMonth(11);//2024-03-11
System.out.println(localDate1);
LocalDate localDate2 = localDate.withYear(2024);//2024-03-10
System.out.println(localDate2);
//某个信息 加多少 plus...
LocalDate localDate3 = localDate.plusMonths(1);//2024-04-10
System.out.println(localDate3);
//某个信息减多少
LocalDate localDate4 = localDate.minusDays(1);//2024-03-09
System.out.println(localDate4);
//获得指定日期的 LocalDate对象
LocalDate of = LocalDate.of(2024, 5, 2);//2024-05-02
System.out.println(of);
//判断 日期是否相同 或是否 在其之前或者之后
System.out.println(localDate1.equals(localDate2));//false
System.out.println(localDate2.isBefore(localDate3));//true
System.out.println(localDate3.isAfter(localDate4));//true
LocalDateTime 有一个不同的一点就是它可以把其对象转换为LocalDate或者LocalTime
LocalDateTime localDateTime =LocalDateTime.now();
System.out.println(localDateTime);//2024-03-10T20:30:12.089798600
LocalDate localDate5 = localDateTime.toLocalDate();
System.out.println(localDate5);//2024-03-10
LocalTime localTime = localDateTime.toLocalTime();
System.out.println(localTime);//20:30:12.089798600
2.2 ZoneId 、ZoneIdTime
//时区信息 我们是东八区
ZoneId zoneId=ZoneId.systemDefault();
System.out.println(zoneId); //
System.out.println(zoneId.getId());//和上边一样 ZoneId 重写了tostring 就是使用的getid()方法
//获取java支持的所有时区id
System.out.println(ZoneId.getAvailableZoneIds());//[Asia/Aden, America/Cuiaba, Etc/GMT+9, Etc/GMT+8, Africa/Nairobi, America/Marigot, Asia/Aqtau, Pacific/Kwajalein, America/El_Salvador, Asia/Pontianak, Afri等...
//把某个时区id 转为封装为Zondid对象
ZoneId of1 = ZoneId.of("America/New_York");
System.out.println(of1);//America/New_York
//带时区的时间
//获取某个时区的ZoneDateTime对象.
System.out.println(ZonedDateTime.now());
ZonedDateTime now = ZonedDateTime.now(of1);//2024-03-10T20:40:02.767630300+08:00[Asia/Shanghai]
System.out.println(now); //2024-03-10T08:40:02.767630300-04:00[America/New_York] 带时区信息的 纽约与中国差12h
//世界标准时区时间
System.out.println(ZonedDateTime.now(Clock.systemUTC()));//2024-03-10T12:41:32.318277500Z
2.3 Instant
Instant now = Instant.now();
System.out.println(now);//注意 返回的是标准时区时间 而不是我们系统的时间 差8h //2024-03-10T12:48:45.917343800Z
System.out.println(now.getEpochSecond());//秒数 1710074925
System.out.println(now.getNano()); //纳秒数 917343800
2.4 DateTimeFormatter
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime=LocalDateTime.now();
//格式化时间
String format =dateTimeFormatter.format(localDateTime);
System.out.println(format); //2024-03-10 20:54:07
//格式化时间的另一种方式
String format1=localDateTime.format(dateTimeFormatter);
System.out.println(format1);//2024-03-10 20:55:14
//解析时间
String s="2024-03-10 20:57:03";
LocalDateTime parse = LocalDateTime.parse(s, dateTimeFormatter);
System.out.println(parse); //2024-03-10T20:57:03 System.out.println(dateTimeFormatter.parse(s));
2.5 Period
LocalDate of = LocalDate.of(2000, 2, 1);
LocalDate of1 = LocalDate.of(2001, 3, 5);
Period between = Period.between(of, of1);
System.out.println(between.getDays());//相差天数 4
System.out.println(between.getMonths()); //1
2.6 Duration
LocalDateTime of2 = LocalDateTime.of(2000, 6, 11, 9, 2, 10, 1);
LocalDateTime of3 = LocalDateTime.of(2001, 8, 11, 9, 2, 10, 1);
Duration between1 = Duration.between(of2, of3);
System.out.println(between1.toDays());//天 426
System.out.println(between1.toHours());//小时 102240