
🌸雨落在了我的手上:个人主页
🐟个人仓库:Gitee仓库
❄️个人专栏:<<JaveSe>> <<C语言>> <<C语言数据结构>>**
🔥🔥🔥人生格言:无人扶我青云志,我自踏雪至山巅
🎬 博主简介:

目录
内容大纲:
本文介绍了Java中两个重要的工具类:1. 日期时间类:对比了传统的Date类(已过时)和Java 8引入的LocalDateTime类,详细说明后者创建对象、获取日期时间信息、格式化解析、日期运算等常用方法;2. BigDecimal类:讲解其精确计算特性、不同构造方法差异(推荐使用String构造),并演示加减乘除运算,特别强调除法运算中精度处理和舍入模式设置的重要性。全文通过代码示例展示各类的核心用法,是Java基础编程中日期处理和精确计算的实用指南。
一:⽇期相关类
1.Date类
Date类是Java早期版本中⽤于表⽰⽇期和时间的类,位于 java.util 包中。它表⽰⼀个特定的⽇期 和时间,精确到毫秒级别。
官⽅提供的帮助⽂档⼿册:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Date.html
常⻅的构造⽅法如下:
我们可以看到部分⽅法已经过时。
java
import java.util.Date;
public class Test {
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1);
Date date2 = new Date(123,2,5);//已过时
System.out.println(date2);
}
}
输出:
Date date2 = new Date(123,2,5); 该⽅法中,需要注意参数的意义:
- 参数⼀:Date默认的时间是从1900年开始计算的,这⾥的123会和1900相加得到2023,⽤来确定 年份
- 参数⼆:2代表3⽉,也就是说0代表1⽉,1代表2⽉,以此类推
- 参数三:代表实际的⽇期
- CST:代表时区
- 不带参数的构造⽅法表⽰获取的是当前的时间如:15:30:46
- 给定参数后,没有指定时间,默认是00:00:00
当我们查看源码后发现,很多⽅法都已经过时了。⽬前我们使⽤更多的是LocalDateTime类。所以, 我们重点要看看这个类!!
2.LocalDateTime类
LocalDateTime 是Java 8引⼊的⽇期类
官⽅⼿册:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/LocalDateTime.html
LocalDateTime 类只有⼀个私有的构造⽅法,共其内部进⾏调⽤。
1.创建LocalDateTime对象
java
public static void main(String[] args) {
//当前日期和时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
//指定日期和时间
LocalDateTime dateTime = LocalDateTime.of(2023, 5, 15, 10, 30);
System.out.println(dateTime);
//字符串解析
LocalDateTime parsed = LocalDateTime.parse("2023-05-15T10:30:00");
System.out.println(parsed);
}
输出:
2.常⽤⽅法-获取当前⽇期
java
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(" 当前时间为: "+dateTime );
}
输出:
3.常⽤⽅法-获取当前年⽉⽇
java
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
int year = dateTime.getYear();
int month = dateTime.getMonthValue();
int day = dateTime.getDayOfMonth();
int hour = dateTime.getHour();
int minute = dateTime.getMinute();
int second = dateTime.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);
}
输出:
4.常⽤⽅法-创建指定的⽇期
java
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.of(1999, 5, 15, 10, 30);
System.out.println(" 当前⽇期为: "+dateTime);
}
输出:
5.常⽤⽅法-根据字符串创建⽇期
java
public static void main(String[] args) {
// 原始字符串
String stringDate = "2026-10-01 10:30:21";
// 修正点:将 "yyyy MM-dd" 改为 "yyyy-MM-dd" 以匹配字符串中的横杠
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime date = LocalDateTime.parse(stringDate, dateTimeFormatter);
System.out.println("当前日期为: " + date);
}
输出:
需要注意的是这⾥⼀定是: yyyy-MM-dd HH:mm:ss ⼤⼩写需要注意。
6.常⽤⽅法-获取具体详细信息
获取本周周⼏、本⽉第⼏天,当年第⼏天
java
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(" 当前⽇期为: "+dateTime);
System.out.println(" 本周周⼏: "+dateTime.getDayOfWeek().getValue());
System.out.println(" 本⽉第⼏天: "+dateTime.getDayOfMonth());
System.out.println(" 当年第⼏天: "+dateTime.getDayOfYear());
}
输出:
7.常⽤⽅法-⽇期运算
增加、减少天数
java
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime newDatePlus = dateTime.plusDays(1);
System.out.println(" 增加 1 天后的⽇期: "+newDatePlus);
LocalDateTime newDateMinus = dateTime.minusDays(1);
System.out.println(" 减少 1 天后的⽇期: "+newDateMinus);
}
输出:
8.常⽤⽅法-根据当前时间获取指定时间
获取当前⽇期所在周的周⽇和周⼀
java
public static void main(String[] args) {
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);
}
输出:
- previousOrSame:寻找当前⽇期或之前最近的指定星期⼏
- nextOrSame:寻找当前⽇期或之后最近的指定星期⼏
二:BigDecimal类
BigDecimal是Java在java.math包中提供的 线程安全的API类,⽤来对超过16位有效位的数进⾏精确 的运算。双精度浮点型变量double可以处理16位有效数,但在实际应⽤中,可能需要对更⼤或者更⼩ 的数进⾏运算和处理。
官⽅⽂档⼿册:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/math/BigDecimal.html
1.常⽤的构造⽅法
| 构造器 | 描述 |
|---|---|
BigDecimal(int) |
创建一个具有参数所指定整数值的对象。 |
BigDecimal(double) |
创建一个具有参数所指定双精度浮点数值的对象。【注意:此构造方法可能会丢失精度】,因为 double 本身存在二进制表示误差,不建议直接使用。 |
BigDecimal(long) |
创建一个具有参数所指定长整数值的对象。 |
BigDecimal(String) |
创建一个具有参数所指定以字符串表示的数值的对象。这是最推荐、最安全的方式,能完全保留原始数值的精度。 |
java
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);
}
输出:
⽐较有意思的是,这⾥第⼀个输出的结果⾮常⻓,主要原因是使⽤ new BigDecimal(1.99) 时, 实际上是将⼀个已经被舍⼊的double值传递给了BigDecimal。BigDecimal然后精确地表⽰了这个已 经不精确的double值。
2.常⽤⽅法-加减乘
java
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);
}
输出:
注意:
- 参与运算后会⽣成新的BigDecimal对象
3.常⽤⽅法-除
java
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 异常。在你的例⼦中,1.35除以3.22的结果正是⼀个⽆限循环⼩数
解决⽅案⼀:
指定精度和舍⼊模式
java
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);
}
输出:
- 4表⽰除法运算结果的⼩数部分保留4位
- RoundingMode.HALF_UP代表四舍五⼊
关于第3个参数属于运算的模式
常⻅的有:
| 构造器 | 描述 |
|---|---|
BigDecimal(int) |
创建一个具有参数所指定整数值的对象。 |
BigDecimal(double) |
创建一个具有参数所指定双精度浮点数值的对象。【注意:此构造方法可能会丢失精度】,因为 double 本身存在二进制表示误差,不建议直接使用。 |
BigDecimal(long) |
创建一个具有参数所指定长整数值的对象。 |
BigDecimal(String) |
创建一个具有参数所指定以字符串表示的数值的对象。这是最推荐、最安全的方式,能完全保留原始数值的精度。 |
解决⽅案⼆:使⽤MathContext
java
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);
}
输出:
- newMathContext(4,RoundingMode.HALF_UP),若不指定的情况下默认是: RoundingMode.HALF_UP模式。
以上就是我们全部的javase的所有内容了,后面就是数据结构了!!!!