JDK8的LocalDateTime用法
Java8全新的日期和时间API
1.1 LocalDate
LocalDate是日期处理类,具体API如下:
// 获取当前日期 LocalDate now = LocalDate.now(); // 设置日期 LocalDate localDate = LocalDate.of(2019, 9, 10); // 获取年 int year = localDate.getYear(); //结果:2019 int year1 = localDate.get(ChronoField.YEAR); //结果:2019 // 获取月 Month month = localDate.getMonth(); // 结果:SEPTEMBER int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果:9 // 获取日 int day = localDate.getDayOfMonth(); //结果:10 int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果:10 // 获取星期 DayOfWeek dayOfWeek = localDate.getDayOfWeek(); //结果:TUESDAY int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK); //结果:2
1.2 LocalTime
LocalTime是时间处理类,具体API如下:
// 获取当前时间 LocalTime now = LocalTime.now(); // 设置时间 LocalTime localTime = LocalTime.of(13, 51, 10); //获取小时 int hour = localTime.getHour(); // 结果:13 int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13 //获取分 int minute = localTime.getMinute(); // 结果:51 int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51 //获取秒 int second = localTime.getSecond(); // 结果:10 int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10
1.3 LocalDateTime
LocalDateTime可以设置年月日时分秒,相当于LocalDate + LocalTime
// 获取当前日期时间 LocalDateTime localDateTime = LocalDateTime.now(); //返回 2021-08-16T09:38:23.630
LocalDate localDate=LocalDate.now(); //返回 2021-08-16 LocalTime localTime=LocalTime.now(); //返回 09:38:23.629
// 设置日期 LocalDateTime localDateTime1 = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56); //返回 2019-09-10T14:46:56 LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime); //返回 2021-08-16T09:45:07.694 LocalDateTime localDateTime3 = localDate.atTime(localTime); //返回 2021-08-16T09:45:07.694 LocalDateTime localDateTime4 = localTime.atDate(localDate); //返回 2021-08-16T09:45:07.694 // 获取LocalDate LocalDate localDate2 = localDateTime.toLocalDate(); //返回 2021-08-16 // 获取LocalTime LocalTime localTime2 = localDateTime.toLocalTime(); //返回 09:38:23.629
1.4 Instant
// 创建Instant对象 Instant instant = Instant.now(); //返回 2021-08-16T01:46:48.114Z // 获取秒 long currentSecond = instant.getEpochSecond(); //返回 1629078408 // 获取毫秒 long currentMilli = instant.toEpochMilli(); //返回 1629078408114 如果只是为了获取秒数或者毫秒数,使用System.currentTimeMillis()来得更为方便
1.5 修改LocalDate、LocalTime、LocalDateTime、Instant
LocalDate、LocalTime、LocalDateTime、Instant为不可变对象,修改这些对象对象会返回一个副本。增加、减少年数、月数、天数等 以LocalDateTime为例。
// 创建日期:2019-09-10 14:46:56 LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56); //增加一年 localDateTime = localDateTime.plusYears(1); //结果: 2020-09-10 14:46:56 localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //结果: 2021-09-10 14:46:56 //减少一个月 localDateTime = localDateTime.minusMonths(1); //结果: 2021-08-10 14:46:56 localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS); //结果: 2021-07-10 14:46:56
通过with修改某些值,年月日时分秒都可以通过with方法设置
//修改年为2019 localDateTime = localDateTime.withYear(2020); //修改为2022 localDateTime = localDateTime.with(ChronoField.YEAR, 2022);
日期计算。比如有些时候想知道这个月的最后一天是几号、下个周末是几号,通过提供的时间和日期API可以很快得到答案 。TemporalAdjusters提供的各种日期时间格式化的静态类,比如firstDayOfYear是当前日期所属年的第一天
LocalDate localDate = LocalDate.now(); LocalDate localDate1 = localDate.with(TemporalAdjusters.firstDayOfYear());
格式化时间。DateTimeFormatter默认提供了多种格式化方式,如果默认提供的不能满足要求,可以通过DateTimeFormatter的ofPattern方法创建自定义格式化方式
LocalDate localDate = LocalDate.of(2019, 9, 10); //返回 2019-09-10 String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE); //返回 20190910 String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); //返回 2019-09-10 //自定义格式化 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); String s3 = localDate.format(dateTimeFormatter); //返回 10/09/2019
解析时间。和SimpleDateFormat相比,DateTimeFormatter是线程安全的
LocalDate localDate1 = LocalDate.parse("20190910", DateTimeFormatter.BASIC_ISO_DATE); //返回 2019-09-10 LocalDate localDate2 = LocalDate.parse("2019-09-10", DateTimeFormatter.ISO_LOCAL_DATE);
//返回 2019-09-10
LocalDateTime与String日期互相转换
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime time = LocalDateTime.now(); String localTime = df.format(time); LocalDateTime ldt = LocalDateTime.parse("2017-09-28 17:07:05",df); System.out.println("LocalDateTime转成String类型的时间:"+localTime); System.out.println("String类型的时间转成LocalDateTime:"+ldt);
控制台结果:
LocalDateTime转成String类型的时间:2017-09-30 10:40:06
String类型的时间转成LocalDateTime:2017-09-28T17:07:05
在使用Java程序操作数据库时,我们需要把数据库类型与Java类型映射起来。下表是数据库类型与Java新旧API的映射关系: