特性
- 线程安全
- 不可变
- 由date和time两部分结合
- 可以转换成其他形式的时间,如LocalDate、LocalTime
- 可以进行任意精度的加减,如年、月、日、时、分、秒、纳秒。
创建方法
// 获取本地时间 LocalDateTimenow(); // 获取参数时区的时间LocalDateTimenow(ZoneIdzone); // 从指定时钟获取时间LocalDateTimenow(Clockclock); // 从TemporalAdjuster获取时间LocalDateTimewith(TemporalAdjusteradjuster); LocalDateTime.of(intyear, Monthmonth, intdayofMonth, inthour, intminute); LocalDateTime.of(intyear, Monthmonth, intdayoMonth, inthour, intminute, intsecond); LocalDateTime.of(intyear, Monthmonth, intdayoMonth, inthour, intminute, intsecond, intnanoOfSecond);
Month是个枚举类型的变量。 Month
int类型的month的方法,也有三个版本。
LocalDateTime.of(intyear, intmonth, intdayofMonth, inthour, intminute); LocalDateTime.of(intyear, intmonth, intdayofMonth, inthour, intminute, intsecond); LocalDateTime.of(intyear, intmonth, intdayofMonth, inthour, intminute, intsecond, intnanoOfSecond);
当然也可以使用LocalDate和LocalTime构建LocalDateTime。
LocalDateTime.of(LocalDatedate, LocalTimetime);
时间转换
从LocalDateTime可以非常容易转换成其他形式的时间。
ps:数据库中将类型设为datetime就可以直接映射为LocalDateTime。
从LocalDateTime获取LocalDate
只能进行精度大于或等于日的加减,如年、月、日。
// 得到日期LocalDatetoLocalDate(); // 获取年份intgetYear(); // 获取月份,用int表示intgetMonthValue(); // 获取月份MonthgetMonth(); // 获取在月份中的天数intgetDayOfMonth(); // 获取年中的天数intgetDayOfYear(); // 获取周中的天数,枚举类型DayOfWeekgetDayOfWeek();
DayOfWeek是个枚举类型。DayOfWeek
/*** 计算年份* 可计算years,months,weeks,days,hours,minutes,seconds,nanos* 以上都是long型* 对日期进行计算时,会首先进行计算,然后对得出的时间进行校验,判断是否是有效的时间。* 如果时间无效(比如2021-02-29),那么会将月份中的天数(day-of-month)调整到最后一个有效日期(2021-02-28)。**/LocalDateTimeplusYears(longyears); LocalDateTimeminusYears(longyears); LocalDateTImeplusMonths(longmonths); LocalDateTimeminusMonths(longmonths); ...
从LocalDateTime获取LocalTime
只能进行精度小于时的加减,如时、分、秒、纳秒。
// 得到时间LocalTimetoLocalTime(); // 获取小时intgetHour(); // 获取分钟intgetMinute(); // 获取秒intgetSecond(); // 获取纳秒intgetNano();
“特殊”时间
很多时候我们需要一些比较“特殊”的时间,例如周一,一个月的第一天等等。
我们当然可以通过LocalDateTime来计算出其他时间。比如获取本周周一的时间。
LocalDateTimelocalDateTime=LocalDateTime.now(); intday=localDateTime.getDayOfWeek().getValue(); LocalDateTimemonday=localDateTime.minusDays(day-1);
这样通过minusDays()进行计算就可以得到本周周一的时间,但是这样做的弊端是需要计算的日期要减一,一不留神就会出错。
所以推荐另一种方法:使用调整器类TemporalAdjusters。
同样是获取周一时间,使用TemporalAdjusters的方法如下,非常好~用~。
// 本周一LocalDateTime.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 本月第一天LocalDateTime.now().with(TemporalAdjusters.firstDayOfMonth);
TemporalAdjusters类实际上是一个工具类,里面的方法都是对时间的调整,返回一个时间的副本,都是一些“特殊”的时间。
比如本月第一天,本月最后一天,下月第一天,本年第一天,本年最后一天等等。使用LocalDateTime的with函数便可以得到LocalDateTime类型的时间。
TemporalAdjusterfirstDayOfMonth(); TemporalAdjusterlastDayOfMonth(); TemporalAdjusterfirstDayOfNextMonth(); TemporalAdjusterfirstDayOfYear(); TemporalAdjusterlastDayOfYear(); TemporalAdjusterfirstDayOfNextYear(); TemporalAdjusterfirstInMonth(DayOfWeekdayOfWeek); TemporalAdjusterlastInMonth(DayOfWeekdayOfWeek); TemporalAdjusterdayOfWeekInMonth(intordinal, DayOfWeekdayOfWeek); TemporalAdjusternext(DayOfWeekdayOfWeek); TemporalAdjusternextOrSame(DayOfWeekdayOfWeek); TemporalAdjusterprevious(DayOfWeekdayOfWeek); TemporalAdjusterpreviousOrSame(DayOfWeekdayOfWeek);
比较
/*** 比较时间* -1隐式参数<显示参数 0相等 1隐>显* **/intcompareTo0(LocalDateTimeother); // 判断是否在给定日期之前/之后booleanisBefore(ChronoLocalDateTime<?>other); booleanisAfter(ChronoLocalDateTime<?>other);
异常
DateTimeException
当用户设置时间时,字段的值超出限制,或者月中的日期无效,比如13月,或者2月31日,那么会抛出DateTimeException异常。
DateTimeParseException
是DateTimeException的子类。
使用parse()时,如果文本无法解析,会抛出DateTimeParseException。
Enums
DayOfWeek
不可变,线程安全
- MONDAY 1
- TUESDAY 2
- WEDNESDAY 3
- THURSDAY 4
- FRIDAY 5
- SATUDAY 6
- SUNDAY 7
Month
不可变,线程安全
- JANUARY 1
- FEBRUARY 2
- MARCH 3
- APRIL 4
- MAY 5
- JUNE 6
- JULY 7
- AUGUST 8
- SEPTEMBER 9
- OCTOBER 10
- NOVEMBER 11
- DECEMBER 12