java之LocalDateTime初级使用

简介: 在旧版的java中,时间日期api存在很多问题,比如java.util.Date非线程安全,不支持国际化;在多个包内有相同名字的定义等。所以在java8中新增了新的日期时间api来取代古老的Date。本文主要介绍一下新的日期时间api的LocalDateTime的使用。

特性

  • 线程安全
  • 不可变
  • 由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
相关文章
|
4月前
|
存储 Java
Java LocalDateTime与hutool DateUtil实现秒转换为时分秒格式化展示。
注意:以上代码示例仅适合于处理小于24小时内(86400s) 总积 因 LocalDateTime 和 Local Time 不支持超过24小时表达而 huo tool示例虽然理论上支持但未考虑超过24小时情况下可能出现负值等异常情况处理细节需用户自行添加相关逻辑以确保正确性.
335 7
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
1820 4
Java String、Date、Calendar、LocalDate和LocalDateTime互转
Java String、Date、Calendar、LocalDate和LocalDateTime互转
275 0
|
Java API
Java一分钟之-Java日期与时间API:LocalDate, LocalDateTime
【5月更文挑战第13天】Java 8引入`java.time`包,改进日期时间API。`LocalDate`代表日期,`LocalDateTime`包含日期和时间。本文概述两者的基本用法、常见问题及解决策略。创建日期时间使用`of()`和`parse()`,操作日期时间有`plusDays()`、`minusMonths()`等。注意点包括:设置正确的`DateTimeFormatter`,考虑闰年影响,以及在需要时区信息时使用`ZonedDateTime`。正确使用这些类能提升代码质量。
563 3
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
Java
java-时间获取-LocalDateTime
java-时间获取-LocalDateTime
211 0
|
Java
Java中第三代日期类LocalDateTime的详细使用
Java中第三代日期类LocalDateTime的详细使用
277 0
Java中第三代日期类LocalDateTime的详细使用
|
XML 缓存 安全
Java初级-Spring常见面试题总结
Java初级-Spring常见面试题总结
Java:Date和LocalDateTime获取当前时间
Java:Date和LocalDateTime获取当前时间
410 0