一般国内项目:LocalDate,MonthDay,YearMonth,LocalTime,LocalDateTime就够了。
LocalDate类(年月日)
//获取时间分量
LocalDate l = LocalDate.now();//获取今天的日期,2021-10-25
int y = l.getYear();//方式一:获取年
int y = l.get(ChronoField.YEAR);//方式二:获取年
int m = l.getMonthValue();//方式一:获取月(范围:1-12)
int m = l.getMonth().getValue();//方式二:获取月(范围:1-12)
int m = l.get(ChronoField.MONTH_OF_YEAR);//方式三:获取月(范围:1-12)
int d = l.getDayOfMonth();//方式一:获取日
int d = l.get(ChronoField.DAY_OF_MONTH);//方式二:获取日
int w = l.getDayOfWeek().getValue();//方式一:获取星期几(1:星期一)
int w = l.get(ChronoField.DAY_OF_WEEK)//方式二:获取星期几(1:星期一)
int i = l.getDayOfYear();//这一年当中第几天
int i = l.lengthOfMonth();//本月有多少天
int i = l.lengthOfYear();//本年有多少天
long l = l.toEpochDay();//与(时间原点)1970年相差天数
boolean b = l.isLeapYear();//是否是闰年
ValueRange r = l.range(ChronoField.DAY_OF_MONTH);//获取当前月的天数范围(结果:1 - 31或28,20,30)
//修改时间分量
//注意:修改时间分量会创建一个新的LocalDate对象,如果参数不合理会抛出异常
LocalDate al = LocalDate.of(1949,10,1);//创建任意日期
LocalDate l = LocalDate.now();///获取今天的日期
LocalDate ld = l.withMonth(5);//这个对象改成5月,原来的LocalDate对象还是原来的日期
LocalDate ld = l.withYear(2000);//这个对象改成2000年
LocalDate ld = l.withDayOfMonth(31);//改成31号
LocalDate ld = l.withDayOfYear(80);//本年中第80天的日期
LocalDate ld = l.with(ChronoField.MONTH_OF_YEAR,2);//日期月份改为2月
LocalDate ld = l.plusYears(1);//增加一年,可以负数作为参数,如果碰到闰年且是29号,会变成下一年的2月28号
LocalDate ld = l.plus(1, ChronoUnit.YEARS);//增加一年,效果同plusYears()
LocalDate ld = l.plus(Period.of(1,3,15));//增加1年3个月15天,参数可以是负数
LocalDate ld = l.minusYears(1);//减少一年
//比较日期,注意:如果日期是字符型的,需要先解析成日期对象
boolean b = localDate1.equals(localDate2)//相等
boolean b = localDate1.isBefore(localDate2)//之前
boolean b = localDate1.isAfter(localDate2);//之后
int i = localDate1.compareTo(localDate2);//正数:localDate1大,0:相同,负数:localDate1小
//计算日期差
long l = localDate1.toEpochDay() - localDate2.toEpochDay();//两个日期相差多少天
//不常用,图形化日历显示用到
int i = l.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);//月第1天放到最左面,每7天1行,当天在第几列
int i = l.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR);//年第1天放到最左面,每七天1行,当天在第几列
//不常用
IsoChronology iso = l.getChronology();//ISO表示公历纪年法
Era era = l.getEra();//CE表示公元后,BCE公元前
java.time.MonthDay(月日)
该类一般用于每年出现的周期性判断,比如生日,纪念日等。
MonthDay md = MonthDay.of(3,5);//创建3月5日
MonthDay md = MonthDay.from(LocalDate localDate);//去掉LocalDate类中的年
LocalDate l = monthDay.atYear(2004);//添加2004年变成LocalDate类
boolean b = monthDay1.equals(monthDay2);//相等,还可以用isBefore等比较。
java.time.YearMonth(年月)
YearMonth ym = YearMonth.of(2004,4);//创建2004年4月
int i = ym.lengthOfMonth();//这年这月有多少天
int i = ym.lengthOfYear();//这年有多少天
LocalTime类(时分秒)
//创建对象
LocalTime lt = LocalTime.now();//当前时间:21:39:42.442
LocalTime lt = LocalTime.of(23,45,34);//创建时间:23:45:34
LocalTime lt = LocalTime.of(23,24);//创建时间:23:24 其实可以不传递秒
LocalTime lt = LocalTime.ofSecondOfDay(102);//一天中102秒的LocalTime对象
//获取时间分量
int hour = lt.getHour();//当前时
int s = lt.getSecond();//当前秒数(0-59)
int i = lt.toSecondOfDay();//这个时间点一天中的多少秒
long l = lt.toNanoOfDay();//这个时间点一天中的多少纳秒
//计算
LocalTime l = lt .plusHours(1);//加1小时(如果超范围,比如25小时,会循环计算)
LocalTime l = lt.truncatedTo(ChronoUnit.MINUTES);//去掉秒
long l = localTime1.until(localTime2, ChronoUnit.MINUTES);//相差多少分钟
//比较
boolean b = localTime1.equals(localTime2);//相等
boolean b = localTime1.isAfter(localTime2);//之后
boolean b = localTime1.isBefore(localTime2);//之前
int i = localTime1.compareTo(localTime2);//1:localTime1大,0:相同,-1:localTime1小
LocalDateTime(年月日时分秒)
其实就是LocalDate和LocalTime的组合。
LocalDateTime ldt = LocalDateTime.now();
LocalDate ld = ldt.toLocalDate();//转换成LocalDate对象
LocalTime lt = ldt.toLocalTime();//转换成LocalTime对象
LocalDateTime l = ldt.truncatedTo(ChronoUnit.DAYS);//去掉天零头,但是有日的数子,只是时分秒部分清零
//比较
boolean b = localDateTime1.equals(localDateTime2);//相等
boolean b = localDateTime1.isAfter(localDateTime2);//之后
boolean b = localDateTime1.isBefore(localDateTime2);//之前
int i = localDateTime11.compareTo(localDateTime12);//0:相同
//计算
long l = localDateTime1.until(localDateTime2, ChronoUnit.MINUTES);//相差多少分钟
DateTimeFormatter(日期时间格式工具类)
Java 8引入了全新的日期时间格式工具,线程安全而且使用方便。它自带了一些常用的内置格式化工具。下面这个例子使用了BASIC_ISO_DATE格式化工具将19890715格式化成19890715
//方式一:day时间格式: 1989-07-15
DateTimeFormatter dtf = DateTimeFormatter.BASIC_ISO_DATE;
LocalDate localDate = LocalDate.parse("19890715",dtf);
System.out.println(localDate);
// 方式二
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
LocalDate ld = LocalDate.now();
String format = ld.format(dtf);
// 方式三:自定义
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate ld = LocalDate.now();
String format = dtf.format(ld);
Period(年月日)
Period p = Period.between(LocalDate day01, LocalDate day02);
p.getDays()//相差多少天
p.getMonths()//相差多少月
p.getYears()//相差多少年
Duration(秒,纳秒)
ZoneOffset(时差)
ZoneOffset类用来表示时区,举例来说印度与GMT或UTC标准时区相差+05:30,可以通过ZoneOffset.of()静态方法来 获取对应的时区。一旦得到了时差就可以通过传入LocalDateTime和ZoneOffset来创建一个OffSetDateTime对象。
LocalDateTime ldt = LocalDateTime.now();//当前时间
ZoneOffset offset = ZoneOffset.of("+05:30");//时差+05:30
OffsetDateTime date = OffsetDateTime.of(ldt , offset);//获取这个时区时间
ZoneId(时区)
ZoneId z = ZoneId.of("Asia/Shanghai");//设置中国时区
ZonedDateTime zt = ZonedDateTime.of(LocalDateTime ldt,ZoneId z);//特定的时区的时间
Instant(时间点,和中国时区相差8小时)
Instant timestamp = Instant.now();//获取当前时间戳,2016-10-25T09:31:25.428Z
long l = timestamp.toEpochMilli();// 毫秒值
Clock(时钟)
Clock c = Clock.systemUTC();//根据系统时间返回当前时间并设置为UTC
Clock c = Clock.systemDefaultZone();//根据系统时钟区域返回时间