Calendar 日历类是一个抽象类,使用Calendar的getInstance()取得一个Calendar的实例,他还有一个子类
GregorianCalendar公历类,可以再构造中指定年月日时分秒等
日期差工具类https://github.com/ai-sx/java/blob/main/src/CalendarUtil.java
-
获取常用值
- cal.get(Calendar.YEAR)//年
- cal.get(Calendar.MONTH) + 1 //月
- cal.get(Calendar.DATE)//日,和DAY_OF_MONTH一样
- cal.get(Calendar.HOUR_OF_DAY)// 时
- cal.get(Calendar.MINUTE)// 分
- cal.get(Calendar.SECOND)// 秒
- cal.get(Calendar.DAY_OF_WEEK)// 星期[2,3,4,5,6,7,1]
- cal.get(Calendar.DAY_OF_YEAR)// 已过天数
- cal.get(Calendar.WEEK_OF_MONTH) //本月的第多少周,和WEDNESDAY一样
- cal.get(Calendar.WEEK_OF_YEAR)// 已过周数(周运算)
- cal.getActualMaximum(Calendar.DATE) //获取当月的最大天数,其余同理
- cal.getActualMinimum(Calendar.DATE) //获取当月的最小天数,其余同理
- cal.getWeeksInWeekYear // 今年周数
- cal.getTimeInMillis(),cal.setTimeInMillis() // 获取,设置毫秒数
- cal. getTime(),cal.setTime() / /获取,设置对应的Date对象
- cal.toInstant // 获取Instant实例
- gcal.isLeapYear(year) // 判断是否是闰年
-
设置值
- cal.set(2013, 5, 4);//年月日
- cal.set(2020, 9, 7, 20, 36, 37);//年月日时分秒
- cal.set(Calendar.YEAR, 2014)// 设置年,其余同理
-
运算值
- cal.add(Calendar.YEAR, 1)//增加年,相减是使用负数,其余同理
- cal.after(cal2) // 比较cal是否再cal2后,before同理
LocalDate
日期API,通过LocalDate.now()获取实例,与之对应的是时间API LocalTime,二者使用方式基本相同,当然还有二则结合的日期时间API LocalDateTime,综合了以上二者的方法
LocalDate(yyyy-MM-dd)
-
getYear,getMonthValue,getDayOfMonth,getDayOfWeek…getValue() // 获取年月日以及星期
-
LocalDate> of(year,month,day),ofEpochDay(day(1970))[与之对应的是toEpochDay],LocalDate.ofYearDay(year,dayofyear) // 指定年月日或者天数获得对象
-
format(DateTimeFormatter.ofPattern(“yyyy-MM-dd”)); //日期格式化 ,其余同理
-
date.plusYears(1) //返回增加1年的副本,原对象无影响,其余同理
date.plus(100, ChronoUnit.DAYS) //等价于date.plusYears(100)
-
date.minusYears(1) //返回减少一年的副本,原对象无影响,其余同理
-
equals,compareTo,isBefore,isAfter //日期的比较
-
with,withYear,withMonth,withDayOfMonth,withDayOfYear // 返回修改年月日后的副本,原对象无影响
LocalDate.now().with(Month.JANUARY) // 获取一月对应的日期,等价于withMonth(1) LocalDate.now().minusDays(7).with(DayOfWeek.MONDAY) // 获取上个星期一对应的日期
-
date.lengthOfYear() // 得到一年的天数
-
date.lengthOfMonth() // 得到一月的天数
-
date.isLeapYear() // 检查今年是否是闰年
-
date.atTime(LocalTime | 时,分,秒) // 返回结合时间的LocalDateTime
LocalTime(HH:mm:ss.毫秒)
- time.toSecondOfDay() //获取当天时间所使用的秒数
LocalDateTime
- LocalDateTime.now().toLocalDate() //获取LocalDate对象
- LocalDateTime.now().toLocalTime() // 获取LocalTIme对象
Instant
在时间线上的瞬间点,适用于表示毫秒,now()获取当前时间差
- Instant.ofEpochSecond(100) // 从秒中获取实例,1S = 1000ms
- Instant.ofEpochMilli(100); // 从毫秒中获取实例
- atZone(ZoneId.systemDefault()).toLocalDate() // 可以通过Instant获取LocalDate等实例
- toEpochMilli() // 获取毫秒数,如下都可以获取毫秒数
System.out.println(System.currentTimeMillis());
System.out.println(new Date().getTime());
System.out.println(instant.toEpochMilli());
System.out.println(Calendar.getInstance().getTimeInMillis());
Date
获取当前日期时间对象,可以指定带毫秒数的有参构造
- getTime()
- toInstant()
- after,before,compareTo,equals,clone
- Date.from(Instant.now())
Date与LocalDateTime,LocalTime,LocalDate的互转
Instant是连接Date和LocalDateTime,LocalTime,LocalDate之间的桥梁
Instant instant = new Date().toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDate localDate = LocalDate.ofInstant(instant, zone);// 转LocalDate,LocalTime同理
LocalDateTime localDateTime = LocalDateTime. (instant, zone);// 转LocalDateTime
Date.from(dateTime.atZone(zone).toInstant()) // LocalDateTime转Date方式
ZonedDateTime zonedDateTime = localDate.atStartOfDay(zone);
ZonedDateTime zonedDateTime = localDate.atStartOfDay().atZone(zone)
Date.from(zonedDateTime.toInstant()) //LocalDate转Date
// 也可以将LocalDate转为LocalDateTime,LocalTime同理
LocalDateTime.of(localDate, localTime); //转LocalDateTime方式1
localTime.now().atDate(localDate)//转LocalDateTime方式2
日期时间差操作
// 日期差操作
Period between = Period.between(LocalDate.now(), LocalDate.of(2018,11,1));
System.out.println(between); // P-1Y-11M-6D 两个日期的时日期差的日期
System.out.println(between.getYears()); // -1
System.out.println(between.getMonths());// -11
System.out.println(between.getDays());// -6
System.out.println(between.negated());// P1Y11M6D 去取反
// 时间差操作
Duration between1 = Duration.between(LocalTime.now(), LocalTime.of(9, 38, 11));
System.out.println(between1);// PT-13H-4M-6.7925839S 两个时间的时间差的时间
System.out.println(between1.toHours()); // -13
System.out.println(between1.toMinutes()); // -787
System.out.println(between1.toSeconds());// -47264
System.out.println(between1.getSeconds()); // PT-13H-4M-6.7925839S
System.out.println(between1.toMillis()); // 毫秒数
//毫秒操作获取两个时间段相差的天数和小时数
int days = (int) ((new Date().getTime() - new Date(1000).getTime()) / (1000*3600*24));
int hours = (int) ((new Date().getTime() - new Date(1000).getTime()) / (1000*3600));