文章目录
- 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开始 要想获得正确月份 要+1System.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);// 10System.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
常用方法其实是差不多的,只不过是含有的内容不同
//获得当前的dateLocalDate localDate=LocalDate.now();System.out.println(localDate);//2024-03-10//获得具体的年月日等信息 get...System.out.println(localDate.getMonth().getValue());//3System.out.println(localDate.getYear());//2024System.out.println(localDate.getDayOfMonth());//10//修改某个信息 并且会返回新的对象 原始对象仍然保存 with...LocalDate localDate1 = localDate.withDayOfMonth(11);//2024-03-11System.out.println(localDate1);LocalDate localDate2 = localDate.withYear(2024);//2024-03-10System.out.println(localDate2);//某个信息 加多少 plus...LocalDate localDate3 = localDate.plusMonths(1);//2024-04-10System.out.println(localDate3);//某个信息减多少LocalDate localDate4 = localDate.minusDays(1);//2024-03-09System.out.println(localDate4);//获得指定日期的 LocalDate对象LocalDate of = LocalDate.of(2024, 5, 2);//2024-05-02System.out.println(of);//判断 日期是否相同 或是否 在其之前或者之后System.out.println(localDate1.equals(localDate2));//falseSystem.out.println(localDate2.isBefore(localDate3));//trueSystem.out.println(localDate3.isAfter(localDate4));//true
LocalDateTime 有一个不同的一点就是它可以把其对象转换为LocalDate或者LocalTime
LocalDateTime localDateTime =LocalDateTime.now();System.out.println(localDateTime);//2024-03-10T20:30:12.089798600LocalDate localDate5 = localDateTime.toLocalDate();System.out.println(localDate5);//2024-03-10LocalTime 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支持的所有时区idSystem.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.917343800ZSystem.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());//相差天数 4System.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