文章目录
- Java中1.8之前有date类和calendar类。其中date类到了1.8大部分的方法被弃用了说明这些方法都有很大的缺陷,而且date类如果不格式化可读性十分差,所以就需要格式化,而格式化使用simpledateformat来进行操作线程不安全。而calendar类是一个共享变量,而且没有做线程不安全,当多个线程同时使用simpledateformat调用format方法时,多个线程会同时调用calendar.setTime方法,而导致的后果时time值一直被修改从而返回的格式化的时间是错误的。而且simpledateformat方法中format和parse方法都是线程不安全的。
- Java1.8之后出现了localdate,localdatetime,localtime这些类,而这些类使用了final来修饰,使得这些类是不可变的,一旦实例化,值就固定了,有点类似于String类,所以这些类都是线程安全的。
localdate是针对于年月日的,localtime是针对于时分秒,localdatetime是针对于年月日时分秒。
- LocalDate是一个不可变的日期时间对象,表示日期,通常被视为年月日。
- LocalDate可具有不可预测的结果,应当避免。
- LocalDate用equals 方法进行比较。
//获取当前日期 年月日(2022-05-31)LocalDate localDate=LocalDate.now();//输入年月日设置时间LocalDate localDate=LocalDate.of(year,month,day);
//获取年份int year= localDate.getYear();int year= localDate.get(ChronoField.YEAR);//注意getMonth方法返回的是Month类,可通过getValue方法获得一个long类型的值,然后可以强转为int类型进行使用Month month= localDate.getMonth();//MAY 对象int month1= localDate.get(ChronoField.MONTH_OF_YEAR);//5int day= localDate.getDayOfMonth();//31int day1= localDate.get(ChronoField.DAY_OF_MONTH);//注意getDayOfWeek方法返回的是DayOfWeek类,可通过getValue方法获得一个long类型的值,然后可以强转为int类型进行使用DayOfWeek dayOfWeek= localDate.getDayOfWeek();//TUESDAYint dayOfWeek1= localDate.get(ChronoField.DAY_OF_WEEK);//2
LocalDate localDate=LocalDate.now();//增加一年 localDate= localDate.plusYears(1); localDate= localDate.plus(1,ChronoUnit.YEARS);//减少一个月 localDate= localDate.minusMonths(1); localDate= localDate.minus(1,ChronoUnit.MONTHS);//减少一日 localDate= localDate.minusDays(1); localDate= localDate.minus(1,ChronoUnit.DAYS);//通过使用with方法进行修改//修改年为2020 localDate= localDate.withYear(2020);//修改为2020 localDate= localDate.with(ChronoField.YEAR,2020);
LocalTime相类似就是把年月日换成时分秒就可以了
创建LocalDateTime可以使用LocalDateTime.of(locaDate,localTime),LocalDate.atTime(localTime),LocalTime.atDate(localDate)来进行创建
LocalDateTime获取LocalDate和LocalTime的方法如下
//获取LocalDateLocalDate localDate= localDateTime.toLocalDate();//获取LocalTimeLocalTime localTime= localDateTime.toLocalTime();
Instant类是1.8之后新增的,与1.8之前的Date类有点相似
Instant的创建方法
Instant instant=Instant.now();//l为1970年1月1日至所记录时间的的毫秒数Instant instant1=Instant.ofEpochMilli(l);
设置时区偏移量
// 按时区设置偏移量OffsetDateTime offsetDateTime= instant.atOffset(ZoneOffset.ofHours(8));// 设置偏移量为8
获取秒数
long currentSecond= instant.getEpochSecond();
获取毫秒数
获取1970年1月1日至所记录时间的的毫秒数,类似于Date类中的getTime方法。
//获取毫秒数long l= instant.toEpochMilli();
对于LocalDate,LocalTime,LocalDateTime,Instant类进行格式化需要使用DateTimeFormatter类
//String转换成日期类型//String类型转换成LocalDate类型LocalDate localDate=LocalDate.parse("2019-12-07");//String类型转换为LocalTime类型LocalTime localTime=LocalTime.parse("17:26:00");//String类型转换为LocalDateTime类型//按照12小时计算DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");//按照24小时计算DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDate localDate=LocalDate.parse("2019-12-07 07:43:53",formatter);//日期类型转换成String类型//localDate转换成StringLocalDate localDate=LocalDate.now();//按照yyyyMMdd样式进行更改String format= localDate.format(DateTimeFormatter.BASIC_ISO_DATE);//按照yyyy-MM-dd样式进行更改String format= localDate.format(DateTimeFormatter.ISO_DATE);//自定义样式进行更改DateTimeFormatter pattern=DateTimeFormatter.ofPattern("yyyy年MM月dd日");String format= localDate.format(pattern);//LocalTime类型转换为String类型//按照xx:xx:xx.xx样式进行转换LocalTime localTime=LocalTime.now();String format3= localTime.format(DateTimeFormatter.ISO_TIME);//按照自定义样式进行转换DateTimeFormatter formatter=DateTimeFormatter.ofPattern("hh:mm:ss");String format4= localTime.format(formatter);//LocalDateTime类型转换为String类型LocalDateTime localDateTime=LocalDateTime.now();DateTimeFormatter formatter2=DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");String format5= localDateTime.format(formatter2);
方法 | 返回类型 | 介绍说明 |
---|---|---|
getYear() | int | 该日期的年份 |
getMonth() | Month | 该日期月份的对象 |
getMonthValue() | int | 该日期的月份 |
查询、直接修改年份日期等 | ——-—— | —————— |
getDayOfWeek().getValue() | int | 该日期是当前周的第几天 |
getDayOfMonth() | int | 该日期是当前月的第几天 |
getDayOfYear() | int | 该日期是当前年的第几天 |
withYear(int year) | LocalDate | 修改该日期的年份 |
withMonth(int month) | LocalDate | 修改该日期的月份 |
withDayOfMonth(int dayOfMonth) | LocalDate | 修改该日期在当月的天数 |
判断、比较 | ———— | —————— |
isLeapYear() | boolean | 判断是否是闰年 |
lengthOfYear() | int | 获取该年份是365还是366天 |
lengthOfMonth() | int | 当前月份有多少天 |
compareTo(ChronoLocalDate other) | int | 比较该日期与other日期的大小,返回正数,那么当前对象时间较晚(数字较大) |
isBefore(ChronoLocalDate other) | boolean | 比较该日期是否比other日期早(true为早) |
isAfter(ChronoLocalDate other) | boolean | 比较该日期是否比other日期晚(true为晚) |
isEqual(ChronoLocalDate other) | boolean | 比较两个日期是否相等 |
在原有基础上增加年份等 | ———— | —————— |
plusYears(long yearsToAdd) | LocalDate | 当前日期增加指定的年数 |
plusMonths(long monthsToAdd) | LocalDate | 当前日期增加指定的月份 |
plusWeeks(long weeksToAdd) | LocalDate | 当前日期增加指定的周数 |
plusDays(long daysToAdd) | LocalDate | 当前日期增加指定的天数 |
在原有基础上减少年份等 | ———— | —————— |
minusYears(long yearsToSubtract) | LocalDate | 当前日期减少指定的年数 |
minusMonths(long monthsToSubtract) | LocalDate | 当前日期减少指定的月份 |
minusWeeks(long weeksToSubtract) | LocalDate | 当前日期减少指定的周数 |
minusDays(long daysToSubtract) | LocalDate | 当前日期减少指定的天数 |
LocalDate today=LocalDate.now();DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd");String dateStr= today.format(fmt);
String str="2019-03-03";//指定转换格式DateTimeFormatter fmt=DateTimeFormatter.ofPattern("yyyy-MM-dd");//进行转换LocalDate date=LocalDate.parse(str, fmt);
热门文章
- 「10月22日」最高速度22.5M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 广州哪里有领养猫咪的地方(广州哪里有领养猫咪的地方)
- 「8月15日」最高速度20.7M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 哪种猫砂比较好又不贵(哪种猫砂比较好又不贵又安全)
- 「12月13日」最高速度22.6M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 济南宠物领养中心官网招聘 济南宠物领养中心官网招聘信息
- 「11月28日」最高速度19.2M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 「11月20日」最高速度21.8M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 「11月23日」最高速度21.3M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接
- 「8月14日」最高速度20.3M/S,2024年Clash Nyanpasu每天更新免费节点订阅链接