LocalDate和LocalTime的用法介绍

/ Java / 没有评论 / 1396浏览

LocalDate和LocalTime的用法介绍

在JAVA中,常用的处理日期和时间的类主要有Date,Calendar,而在JDK1.8中,新增了两个处理日期和时间的类,一个是LocalDate,另一个是LocalTime,下面我来介绍一下这两个类中常用方法的用法。

一、LocalDate

LocalDate主要是用来处理日期的类,主要有以下方法:

LocalDate.now()

获取当前日期

LocalDate localDate = LocalDate.now();
System.out.println(localDate);
// 运行结果为:2019-01-07

LocalDate.of(int year, int month, int dayOfMonth)

根据参数设置日期,参数分别为年,月,日

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate);
// 运行结果为:2019-01-07

localDate.getDayOfMonth()、localDate.getDayOfWeek()、 localDate.getDayOfYear()

获取当前日期是所在月的第几天,获取当前日期是星期几(星期的英文全称),获取当前日期是所在年的第几天。

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate.getDayOfMonth()); 
System.out.println(localDate.getDayOfWeek()); 
System.out.println(localDate.getDayOfYear());
// 运行结果为:7,MONDAY,7

localDate.getMonth()、localDate.getMonthValue()、localDate.lengthOfMonth()

获取当前日期所在月份(月份的英文全称),获取当前日期所在月份的数值,获取当前日期所在月份有多少天

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate.getMonth()); 
System.out.println(localDate.getMonthValue()); 
System.out.println(localDate.lengthOfMonth());
// 运行结果为:JANUARY,1,31

localDate.lengthOfYear()、localDate.isLeapYear()

获取当前日期所在年有多少天,获取当前日期所在年是否是闰年

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate.lengthOfYear()); 
System.out.println(localDate.isLeapYear());
// 运行结果为:365,false

localDate.withDayOfMonth(int dayOfMonth)、localDate.withDayOfYear(int dayOfYear)、localDate.withMonth(int month)、localDate.withYear(int year)

with开头的方法,我的理解是将参数替换localDate中的对应属性,重新计算得到新的日期。将参数中的"日"替换localDate中的"日",将参数中的天数替换localDate中的天,数将参数中的"月"替换localDate中的"月",将参数中的"年"替换localDate中的"年"。

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate.withDayOfMonth(2)); 
System.out.println(localDate.withDayOfYear(40)); 
System.out.println(localDate.withMonth(2));
System.out.println(localDate.withYear(2020));
// 运行结果为:2019-01-02,2019-02-09,2019-02-07,2020-01-07

localDate.minusDays(long days)、localDate.minusWeeks(long weeks)、localDate.minusMonths(long months)、localDate.minusYears(long years)、localDate.plusDays(long days)、localDate.plusWeeks(long weeks)、localDate.plusMonths(long months)、localDate.plusYears(long years)

将当前日期减一天、将当前日期减一周、将当前日期减一月、将当前日期减一年、将当前日期加一天将、当前日期加一周、将当前日期加一月、将当前日期加一年

LocalDate localDate = LocalDate.of(2019,1,7); 
System.out.println(localDate.minusDays(1)); 
System.out.println(localDate.minusMonths(1)); 
System.out.println(localDate.minusWeeks(1)); 
System.out.println(localDate.minusYears(1)); 
System.out.println(localDate.plusDays(1)); 
System.out.println(localDate.plusMonths(1)); 
System.out.println(localDate.plusWeeks(1)); 
System.out.println(localDate.plusYears(1));
// 运行结果为:2019-01-06 2018-12-07 2018-12-31 2018-01-07 2019-01-08 2019-02-07 2019-01-14 2020-01-07

 二、LocalTime

LocalTime主要是用来处理时间的类,主要有以下方法:

LocalTime.now()

获取当前时间

LocalTime localTime = LocalTime.now(); 
System.out.println(localTime);
// 运行结果为:22:53:44.277

LocalTime.of(int hour, int minute)、 LocalTime.of(int hour, int minute, int second)

根据参数设置时间,参数分别为时,分根据参数设置时间,参数分别为时,分,秒

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime);
localTime = LocalTime.of(12,35);
System.out.println(localTime);
// 运行结果为:12:35:59,12:35

localTime.getHour()、localTime.getMinute()、localTime.getSecond()

获取当前时间的小时数获,取当前时间的分钟数,获取当前时间的秒数

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());
// 运行结果为:12,35,59

localTime.withHour(int hour)、localTime.withMinute(int minute)、localTime.withSecond(int second)

with开头的方法,我的理解是将参数替换localTime中的对应属性,重新计算得到新的时间。将参数中的"小时"替换localTime中的"小时",将参数中的"分钟"替换localTime中的"分钟",将参数中的"秒"替换localTime中的"秒"

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.withHour(1));
System.out.println(localTime.withMinute(1));
System.out.println(localTime.withSecond(1));
// 运行结果为:01:35:59 12:01:59 12:35:01

localTime.minusHours(long hours)、localTime.minusMinutes(long minutes)l、ocalTime.minusSeconds(long seconds)、localTime.plusHours(long hours)、localTime.plusMinutes(long minutes)、localTime.plusSeconds(long seconds)

将当前时间减一小时,将当前时间减一分钟,将当前时间减一秒,将当前时间加一小时,将当前时间加一分钟,将当前时间加一秒

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.minusHours(1));
System.out.println(localTime.minusMinutes(1));
System.out.println(localTime.minusSeconds(10));
System.out.println(localTime.plusHours(1));
System.out.println(localTime.plusMinutes(1));
System.out.println(localTime.plusSeconds(10));
// 运行结果为:11:35:59 12:34:59 12:35:49 13:35:59 12:36:59 12:36:09

三、日期 + 时间

从1和2中可以看出,LocalDate的方法主要都是用来处理日期的,而LocalTime的方法主要都是用来处理时间的,但两个类都提供了表示日期 + 时间的方法。

LocalDate提供了atTime方法,用来表示日期 + 时间

LocalDate localDate = LocalDate.of(2019,1,7);
System.out.println(localDate.atTime(LocalTime.now()));
System.out.println(localDate.atTime(10,30));
System.out.println(localDate.atTime(10,30,59));

运行结果为:

2019-01-07T23:21:32.804
2019-01-07T10:30
2019-01-07T10:30:59

LocalTime提供了atDate方法,用来表示日期 + 时间

LocalTime localTime = LocalTime.of(12,35,59);
System.out.println(localTime.atDate(LocalDate.of(2019,1,7)));

运行结果为:

2019-01-07T12:35:59

四、格式转换

从3中我们可以看出,表示日期 + 时间后,格式发生了变化,原来atTime和atDate方法的返回值都是LocalDateTime类,这个类把toString()方法重写了,导致输出的格式变化了。

@Override
public String toString() {
    return date.toString() + 'T' + time.toString();
}

那么想要转换日期或时间的格式该怎么办呢?LocalDate和LocalTime都提供了格式转换的方法,format和parse

LocalDate.format(DateTimeFormatter formatter)

将LocalDate类型的数据转换为String类型的数据,参数为DateTimeFormatter类,该类提供了ofPattern(String pattern)方法,可传入相应的日期格式:yyyy,yyyy-MM,yyyy-MM-dd,yyyy-MM-dd HH,yyyy-MM-dd HH:mm,yyyy-MM-dd HH🇲🇲ss 注:若LocalDate未调用atTime方法,则表示LocalDate只表示日期,则此时不能转换带有时间格式的表示式

LocalDate localDate = LocalDate.of(2019,1,7);
LocalTime localTime = LocalTime.now();
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy");
System.out.println(localDate.atTime(localTime).format(f));

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM");
System.out.println(localDate.atTime(localTime).format(f2));

DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println(localDate.atTime(localTime).format(f3));

DateTimeFormatter f4 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH🇲🇲ss");
System.out.println(localDate.atTime(localTime).format(f4));

DateTimeFormatter f5 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
System.out.println(localDate.atTime(localTime).format(f5));

DateTimeFormatter f6 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
System.out.println(localDate.atTime(localTime).format(f6));
// 运行结果为:2019 2019-01 2019-01-07 2019-01-07 23:49:08 2019-01-07 23:49 2019-01-07 23

LocalTime.format(DateTimeFormatter formatter)

将LocalTime类型的数据转换为String类型的数据,参数为DateTimeFormatter类,该类提供了ofPattern(String pattern)方法,可传入相应的日期格式:yyyy,yyyy-MM,yyyy-MM-dd,yyyy-MM-dd HH,yyyy-MM-dd HH:mm,yyyy-MM-dd HH🇲🇲ss 注:若LocalTime未调用atDate方法,则表示LocalTime只表示时间,则此时不能转换带有日期格式的表示式

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH🇲🇲ss");
System.out.println(LocalTime.now().atDate(LocalDate.now()).format(formatter));
// 运行结果为:2019-01-07 23:07:06 其他格式这里就不一一列举了

LocalDate.parse(CharSequence text)

将日期字符串转换成LocalDate类型,不能转换带时间格式的字符串

System.out.println(LocalDate.parse("2019-10-15"));
// 运行结果为:2019-10-15

LocalTime.parse(CharSequence text)

将时间字符串转换成LocalTime类型,不能转换带日期格式的字符串

System.out.println(LocalTime.parse("22:35:40"));
// 运行结果为:22:35:40

 五、总结

  JDK1.8将处理日期和时间的类从原来的Date,Calendar变成了LocalDate和LocalTime两个类,从原来的一个类处理日期 + 时间,变成了由两个类各司其职,更加体现了面向对象的思想,两个类都各自提供了相应范围内的方法,个人觉得有利有弊。有利的是两个类对各自范围内的日期(时间)的计算都提供了更好的处理方法,双方互不干扰,更加的方便。不利的是在同时需要日期和时间的场景下,这两个类目前提供的atTime和atDate方法还不能令人满意,使用起来不是很方便(还需要转换一下格式)。另外,LocalDate类型对应数据库的日期类型的字段时,是否可以像Date类型那样方便,有待研究。

  好了,先说到这吧!