java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
3.1 LocalDate/LocalTime 的构造方法
3.1.1 LocalDate 的构造方法:
LocalDate 并没有提供公开的构造方法,只提供了一个封装的构造方法供内部使用。
private LocalDate(int year, int month, int dayOfMonth) { this.year = year; this.month = (short) month; this.day = (short) dayOfMonth; }
LocalDate 提供了三种创建实例的方法:
//获取当前时间的LocalDate LocalDate localDate = LocalDate.now(); //获取指定年、月、日 的 LocalDate LocalDate ofDate = LocalDate.of(2016,12,31); //通过解析字符串获取 LocalDate,如果格式不对会抛出 DateTimeParseException LocalDate parseDate = LocalDate.parse("2016-12-31-");
3.1.2 LocalTime 的构造方法:
LocalTime 与LcoalDate 一样,提供了一个封装的构造方法:
private LocalTime(int hour, int minute, int second, int nanoOfSecond) { this.hour = (byte) hour; this.minute = (byte) minute; this.second = (byte) second; this.nano = nanoOfSecond; }
LocalTime 提供了三种创建方法:
LocalTime localTime = LocalTime.now().withNano(0); LocalTime ofTime = LocalTime.of(16,30,25); LocalTime parseTime = LocalTime.parse("12:00:01");
3.2 LocalDate/LocalTime 的常用方法
获取当天的起始时间:atStartOfDay()
LocalDate localDate = LocalDate.now(); LocalDateTime date = localDate.atStartOfDay(); 输出: 2016-12-14T00:00
设置当前日期的时间:atTime()
LocalDate localDate = LocalDate.now(); LocalDateTime date = localDate.atTime(16,25,30); 输出: 2016-12-14T16:25:30
格式转换:format()
常用的获取年、月、日 等方法
int year = localDate.getYear(); int month = localDate.getMonthValue(); int day = localDate.getDayOfMonth();
获取改变月份的LocalDate :withMonth()
LocalDate localDate = LocalDate.now(); LocalDate d = localDate.withMonth(10);
其他常用的日期转换:
// 取本月第1天: LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01 // 取本月第2天: LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02 // 取本月最后一天,再也不用计算是28,29,30还是31: LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31 // 取下一天: LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01 // 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞: LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05
3.3 LocalDate/LocalTime 的总结
在新的Java 8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。