Java中的LocalDateTime类和BigDecimal类详解

 更新时间:2026年06月22日 09:30:21   作者:01_ice  
在Java开发中,LocalDateTime和BigDecimal是处理‌日期时间‌和‌高精度数值运算‌的两个核心类,它们分别解决了传统Date类的线程安全问题以及double/float的精度丢失问题,本文介绍Java中的LocalDateTime类和BigDecimal类,感兴趣的朋友一起看看吧

localdatetime和localdate有什么区别

LocalDateTime 和 LocalDate 是 Java 8 中 java.time 包下的两个核心类,主要区别在于表示的日期时间粒度不同

  • LocalDate:只存储日期(年月日),不包含时间和时区。
  • 例:2025-05-28
  • LocalDateTime:存储日期 + 时间(年月日时分秒纳秒),同样不包含时区。
  • 例:2025-05-28T14:30:15.123

详细对比

特性LocalDateLocalDateTime
信息粒度年月日年月日 + 时分秒纳秒
典型格式yyyy-MM-ddyyyy-MM-ddTHH:mm:ss
构造示例LocalDate.of(2025, 5, 28)LocalDateTime.of(2025, 5, 28, 14, 30)
获取当前值LocalDate.now() → 2025-05-28LocalDateTime.now() → 2025-05-28T14:30:15.123
解析字符串LocalDate.parse("2025-05-28")LocalDateTime.parse("2025-05-28T14:30:15")
常用场景生日、节假日、账单日订单创建时间、日志时间戳

转换方法

两者可以互相转换:

LocalDate date = LocalDate.now();                     // 2025-05-28
LocalDateTime dateTime = date.atStartOfDay();        // 2025-05-28T00:00
LocalDateTime dateTime2 = date.atTime(14, 30, 15);   // 2025-05-28T14:30:15
// 从 LocalDateTime 提取 LocalDate
LocalDate dateBack = dateTime.toLocalDate();         // 2025-05-28

注意事项

  • 都不包含时区:如果需要处理时区(如数据库 TIMESTAMP WITH TIME ZONE 或跨时区业务),应使用 ZonedDateTime 或 OffsetDateTime
  • 数据库映射:JPA 2.2 以上可以直接使用;旧版本可能需要配置转换器或使用 java.sql.Date / Timestamp
  • 比较时间LocalDate 只能比较到天;LocalDateTime 可以比较到纳秒级。

1、LocalDateTime类

官方手册

Local Date Time只有一个私有的构造方法

1.1 创建LocalDateTime 对象

//当前时间
LocalDateTime now = LocalDateTime.now();
//指定时间
LocalDateTime localDateTime = LocalDateTime.of(2026,6,5,16,30);
//字符串转时间
LocalDateTime parse = LocalDateTime.parse("2026-06-05T16:30:00");
System.out.println(now);
System.out.println(localDateTime);
System.out.println(parse);

获取当前年月日

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println(" 年: "+year);
System.out.println(" 月: "+month);
System.out.println(" 日: "+day);
System.out.println(" 时: "+hour);
System.out.println(" 分: "+minute);
System.out.println(" 秒: "+second);

获取具体详细信息

LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间" + now);
System.out.println("本周周几" + now.getDayOfWeek().getValue());
System.out.println("当月第几天" + now.getDayOfMonth());
System.out.println("当年第几天" + now.getDayOfYear());

日期运算

增减,减少天数

LocalDateTime now = LocalDateTime.now();
LocalDateTime newDatePlus = now.plusDays(1);
System.out.println("增加一天的日期" + newDatePlus);
LocalDateTime newDateMinus = now.minusDays(1);
System.out.println("减少一天的日期" + newDateMinus);
LocalDateTime newWeekPlus = now.plusWeeks(1);
System.out.println("增加一周的日期" + newWeekPlus);
LocalDateTime newWeekMinus = now.minusWeeks(1);
System.out.println("减少一周的日期" + newWeekMinus);

年和月与上面一样

根据当前时间获取指定时间

  • previousOrSame:寻找当前日期或之前最近的指定星期几
  • nextOrSame:寻找当前日期或之后最近的指定星期几
LocalDateTime currentDate = LocalDateTime.now();
LocalDateTime firstDayOfWeek =
    currentDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDateTime lastDayOfWeek =
    currentDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println("这周的星期一" + firstDayOfWeek);
System.out.println("这周的星期天" + lastDayOfWeek);

获取当前日期所在月的第一天和最后一天的日期

public static void main(String[] args) {
    LocalDateTime currentDate = LocalDateTime.now();
    LocalDateTime firstDayOfMonth = 
currentDate.with(TemporalAdjusters.firstDayOfMonth());
    LocalDateTime lastDayOfMonth = 
currentDate.with(TemporalAdjusters.lastDayOfMonth());
    System.out.println(firstDayOfMonth);
    System.out.println(lastDayOfMonth);
}

2、BigDecimal 类

BigDecimal 是 Java在java.math包中提供的 线程安全 的API类,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量doble可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。官方手册 Decial(小数,十进制)

public static void main(String[] args) {
    BigDecimal doubleNum =new BigDecimal(1.99);
    System.out.println( doubleNum);
    BigDecimal stringNum = new BigDecimal("2.99");
    System.out.println( stringNum);
}
//输出结果:
1.9899999999999999911182158029987476766109466552734375
2.99

使用new BigDecimal(1.99)时,实际上是将一个已经被舍入的double值传递给了 BigDecial。BigDecial 然后精确地表示了这个已经不精确的double值

2.1 加减乘

public static void main(String[] args) {
    BigDecimal a =new BigDecimal("1.35");
    BigDecimal b = new BigDecimal("3.22");
    BigDecimal addRet = a.add(b);
    System.out.println(addRet);
    BigDecimal subRet = a.subtract(b);
    System.out.println(subRet);
    BigDecimal mulRet = a.multiply(b);
    System.out.println(mulRet);
}

参与运算后会生成新的BigDecial 对象

2.2 除

public static void main(String[] args) {
    BigDecimal a =new BigDecimal("1.35");
    BigDecimal b = new BigDecimal("3.22");
    BigDecimal divRet = a.divide(b);
    System.out.println(divRet);
}

BigDecimal的divide⽅法在进⾏除法运算时,如果结果是⼀个⽆限循环⼩数,就会抛出 ArithmeticException 异常

指定精度和舍⼊模式

public static void main(String[] args) {
    BigDecimal a =new BigDecimal("1.35");
    BigDecimal b = new BigDecimal("3.22");
    BigDecimal divRet = a.divide(b, 4, RoundingMode.HALF_UP);
    System.out.println(divRet);
}
//输出结果 0.4193
  • 4表⽰除法运算结果的⼩数部分保留4位
  • RoundingMode.HALF_UP代表四舍五⼊

使⽤MathContext

public static void main(String[] args) {
    BigDecimal a = new BigDecimal("1.35");
    BigDecimal b = new BigDecimal("3.22");
    BigDecimal divRet = a.divide(b, new MathContext(4,RoundingMode.HALF_UP));
    System.out.println(divRet);
}
//输出结果:
 0.4193

newMathContext(4,RoundingMode.HALF_UP),若不指定的情况下默认是: RoundingMode.HALF_UP模式。

到此这篇关于Java中的LocalDateTime类和BigDecimal类详解的文章就介绍到这了,更多相关Java LocalDateTime类和BigDecimal类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringDataJPA实体类关系映射配置方式

    SpringDataJPA实体类关系映射配置方式

    这篇文章主要介绍了SpringDataJPA实体类关系映射配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 小白必看toString(),String.valueOf,(String)强转

    小白必看toString(),String.valueOf,(String)强转

    在Java中,往往需要把一个类型的变量转换成String 类型,本文主要介绍了toString(),String.valueOf,(String)强转,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java 容器的快速失败(fast-fail)机制

    java 容器的快速失败(fast-fail)机制

    Java容器的快速失败机制是一种在迭代过程中检测并处理集合并发修改的特性,该机制适用于ArrayList、HashMap等集合类,本文就来介绍一下java 容器的快速失败(fast-fail)机制,感兴趣的可以了解一下
    2024-11-11
  • Java 解析Markdown文档格式的两种方式

    Java 解析Markdown文档格式的两种方式

    CommonMark和Flexmark是两种用于解析Markdown文档的Java库,CommonMark提供了一种简洁和一致的Markdown格式语法规范,但不支持目录解析,而Flexmark是一个基于CommonMark的扩展库,不仅遵循了CommonMark规范,还提供了更多灵活的API和扩展功能
    2024-10-10
  • Java三种求水仙花数的方法

    Java三种求水仙花数的方法

    本篇文章通过求水仙花数的实例来让大家对JAVA求数的概念和方法有更深入的理解和应用,学习参考下吧。
    2018-02-02
  • java组件smartupload实现上传文件功能

    java组件smartupload实现上传文件功能

    这篇文章主要为大家详细介绍了java组件smartupload实现上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • SpringSecurity显示用户账号已被锁定的原因及解决方案

    SpringSecurity显示用户账号已被锁定的原因及解决方案

    SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNonLocked()等方法的逻辑,确保返回正确状态,避免误判账户锁定,从而允许合法用户登录,下面给大家介绍SpringSecurity显示用户账号已被锁定的解决方案,感兴趣的朋友一起看看吧
    2025-06-06
  • JAVA初探设计模式的六大原则

    JAVA初探设计模式的六大原则

    这篇文章主要介绍了JAVA初探设计模式的六大原则,对设计模式感兴趣的同学,可以参考下
    2021-05-05
  • Java ShardingJDBC实战演练

    Java ShardingJDBC实战演练

    Sharding-JDBC 采用在 JDBC 协议层扩展分库分表,是一个以 jar 形式提供服务的轻量级组件,其核心思路是小而美地完成最核心的事情
    2021-11-11
  • Java泛型定义与用法入门示例

    Java泛型定义与用法入门示例

    这篇文章主要介绍了Java泛型定义与用法,结合实例形式分析了java泛型的功能、定义、应用场景及相关使用注意事项,需要的朋友可以参考下
    2019-08-08

最新评论