JAVA8新特性中添加的时间处理类,相比与以前使用的Date和Canlendar类,该类在时间处理上更加的简单方便。下面记录一些常用的方法。
目录
2. LocalDateTime.now(ZoneId zoneId)
3. LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute)
4. LocalDateTime.parse(CharSequence text)
5. LocalDateTime.parse(CharSequence text, DateTimeFormatter formatter)
1. localDateTime.plus(TemporalAmount amount)
2. localDateTime.plus(long amountToAdd, TemporalUnit unit)
3. localDateTime.plusYears(long years)
4. localDateTime.plusMonths(long months)
5. localDateTime.plusWeeks(long weeks)
6. localDateTime.plusDays(long days)
7. localDateTime.plusHours(long hours)
8. localDateTime.minus(TemporalAmount amount)
三、修改指定的时间,如将时间修改为当月第一天、当月最后一天、第几周等
1. localDateTime.with(TemporalAdjuster adjuster)
2. localDateTime.withYear(int year)
1. localDateTime.until(Temporal endTime, TemporalUnit unit);
一、获取LocalDateTime类型的时间(静态方法)
1. LocalDateTime.now()
从默认时区的系统时钟获取当前的日期时间。
2. LocalDateTime.now(ZoneId zoneId)
从指定时区的系统时钟获取当前的日期时间。
3. LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute)
从年,月,日,小时和分钟获得 LocalDateTime
的实例,将秒和纳秒设置为零。
LocalDateTime.of有很多重载函数,根据不同的情况使用不同的函数。
4. LocalDateTime.parse(CharSequence text)
从一个文本字符串(如 2007-12-03T10:15:30
获取一个 LocalDateTime
的实例。
5. LocalDateTime.parse(CharSequence text, DateTimeFormatter formatter)
使用特定的格式化 LocalDateTime
从文本字符串获取 LocalDateTime
的实例。
实例如下:
public void test() throws Exception{
//北京时间
LocalDateTime dateTime1 = LocalDateTime.now();
//美国洛杉矶时间
LocalDateTime dateTime2 = LocalDateTime.now(ZoneId.of("America/Los_Angeles"));
//2020年12月1日 13时50分
LocalDateTime dateTime3 = LocalDateTime.of(2020, 12, 1, 13, 50);
//2020年12月2日 8时50分30秒
LocalDateTime dateTime4 = LocalDateTime.of(2020, 12, 2, 8, 50, 30);
//2020年12月14日 12时50秒
LocalDateTime dateTime5 = LocalDateTime.parse("2020-12-14T12:00:50");
//2020年12月8日 17时30分50秒
LocalDateTime dateTime6 = LocalDateTime.parse("2020-12-08 17:30:50", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("北京时间:" + dateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("美国洛杉矶时间:" + dateTime2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("指定时间1:" + dateTime3.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("指定时间2:" + dateTime4.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("指定时间3:" + dateTime5.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("指定时间4:" + dateTime6.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
输出结果如下:
二、增加、减少指定时间(实例方法)
1. localDateTime.plus(TemporalAmount amount)
通常会回调到LocalDateTime.plus(long amountToAdd, TemporalUnit unit)
2. localDateTime.plus(long amountToAdd, TemporalUnit unit)
指定增加的数量,指定增加的单位,如天、月、年,这里需要注意的是,单位传递可以使用Chronounit来获取对应的TemporalUnit的参数值,比如这样调用:
LocalDateTime dateTime2 = dateTime1.plus(5, ChronoUnit.DAYS);指定对dateTime1增加5天时间
3. localDateTime.plusYears(long years)
4. localDateTime.plusMonths(long months)
5. localDateTime.plusWeeks(long weeks)
6. localDateTime.plusDays(long days)
7. localDateTime.plusHours(long hours)
可以直接通过方法名知道,这是指定了单位的添加,不需要我们自定义添加单位,更加方便使用,从年到秒都有相应的函数。
与增加时间相反的则是减少时间,减少时间使用minus()函数
8. localDateTime.minus(TemporalAmount amount)
减少时间的函数的使用和增加时间函数使用一致,这里不再阐述。
实例如下:
public void test() throws Exception{
//北京时间
LocalDateTime dateTime1 = LocalDateTime.now();
LocalDateTime dateTime2 = dateTime1.plus(5, ChronoUnit.DAYS);
//应该是2021年1月2日了
LocalDateTime dateTime3 = dateTime1.plusDays(7);
LocalDateTime dateTime4 = dateTime1.minus(5, ChronoUnit.DAYS);
System.out.println("当前时间:" + dateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
System.out.println("自定义增加5天:" + dateTime2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
System.out.println("增加7天:" + dateTime3.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
System.out.println("自定义减少5天:" + dateTime4.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
输出结果如下:
三、修改指定的时间,如将时间修改为当月第一天、当月最后一天、第几周等
1. localDateTime.with(TemporalAdjuster adjuster)
一个简单的调整器可能只是设置一个字段,如年份字段。 更复杂的调整器可能会将日期设置为该月的最后一天。 TemporalAdjuster
提供了一些常见的调整 。 这些包括找到“月的最后一天”和“下周三”。
获取当月最后一天如下:
LocalDateTime lastDayOfMonth = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
2. localDateTime.withYear(int year)
返回一个localDateTime改变了年份的时间,时间改为参数,如,年份改成2015,参数就是2015,其他如月、日、时、分、秒则不变,其他withDay()等方法不再阐述。
实例如下:
public void test() throws Exception{
//北京时间
LocalDateTime dateTime1 = LocalDateTime.now();
LocalDateTime dateTime2 = dateTime1.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime dateTime3 = dateTime1.withYear(2015);
LocalDateTime dateTime4 = dateTime1.withHour(4);
LocalDateTime dateTime5 = dateTime1.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
System.out.println("当前时间:" + dateTime1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("时间修改为当前时间当月的第一天:" + dateTime2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("时间年份修改为2015的时间:" + dateTime3.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("小时改变为凌晨4时的时间:" + dateTime4.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("当前时间的当月第一天0时0点0分0秒:" + dateTime5.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
输出结果如下:
四、获取指定的时间,如当前时间的周、年、天等
1. localDateTime.getYear()
返回当前时间的年份,其他诸如getDayOfMonth()等不再阐述,可以上面阐述的修改指定时间配合返回需要的年份、天数等。
五、获取两个时间相差的年月日等
1. localDateTime.until(Temporal endTime, TemporalUnit unit);
根据指定的单位计算到另一个日期时间的时间量。这里计算的就是localDateTime到endTime需要增加的单位,下面的例子能更好说明。
实例如下:
public void testMethod1() throws Exception {
List<LocalDateTime> dateTimes = new LinkedList<>();
LocalDateTime dateTime1 = LocalDateTime.of(2018, 12, 28, 0, 0);
//天
LocalDateTime dateTime2 = LocalDateTime.of(2018, 12, 21, 0, 0);
LocalDateTime dateTime3 = LocalDateTime.of(2018, 12, 21, 8, 40);
//月
LocalDateTime dateTime4 = LocalDateTime.of(2018, 11, 28, 0, 0);
LocalDateTime dateTime5 = LocalDateTime.of(2018, 11, 21, 8, 40);
LocalDateTime dateTime51 = LocalDateTime.of(2018, 11, 28, 8, 40);
//年
LocalDateTime dateTime6 = LocalDateTime.of(2019, 12, 28, 0, 0);
LocalDateTime dateTime7 = LocalDateTime.of(2019, 12, 21, 8, 40);
//时
LocalDateTime dateTime8 = LocalDateTime.of(2018, 12, 28, 8, 0);
LocalDateTime dateTime9 = LocalDateTime.of(2018, 12, 28, 8, 40);
long year1 = dateTime1.until(dateTime6, ChronoUnit.YEARS);
long year2 = dateTime1.until(dateTime7, ChronoUnit.YEARS);
long month1 = dateTime1.until(dateTime4, ChronoUnit.MONTHS);
long month2 = dateTime1.until(dateTime5, ChronoUnit.MONTHS);
long month3 = dateTime1.until(dateTime51, ChronoUnit.MONTHS);
long day1 = dateTime1.until(dateTime2, ChronoUnit.DAYS);
long day2 = dateTime1.until(dateTime3, ChronoUnit.DAYS);
long hour1 = dateTime1.until(dateTime8, ChronoUnit.HOURS);
long hour2 = dateTime1.until(dateTime9, ChronoUnit.HOURS);
dateTimes.add(dateTime1);
dateTimes.add(dateTime2);
dateTimes.add(dateTime3);
dateTimes.add(dateTime4);
dateTimes.add(dateTime5);
dateTimes.add(dateTime6);
dateTimes.add(dateTime7);
dateTimes.add(dateTime8);
dateTimes.add(dateTime9);
int count = 0;
for (LocalDateTime localDateTime : dateTimes) {
count++;
System.out.println("date" + count + ":" + localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
System.out.println("年:" + year1);
System.out.println("年:" + year2);
System.out.println("月:" + month1);
System.out.println("月:" + month2);
System.out.println("月:" + month3);
System.out.println("日:" + day1);
System.out.println("日:" + day2);
System.out.println("时:" + hour1);
System.out.println("时:" + hour2);
}
输出结果如下:
六、时间类的相互转换
1. 转换成LocalDate与LocalTime
localDateTime.toLocalDate();localDateTime.toLocalTime();
这里就不再写转换成Date与Canlendar的实例,其一是LocalDateTime毕竟是对前两者的优化,所以前两者能做的,LocalDateTime也能做,并且可能会更方便,其二就是拿到了LocalDateTime,想转成其他类型,配合上面阐述的方法,可以有很多转化路径。