Java常用工具类总结

一、日期相关类

1. Date类(传统,部分已过时)

Date类位于java.util包,表示特定的日期和时间,精确到毫秒。

Date date1 = new Date();           // 获取当前时间
Date date2 = new Date(123, 2, 5);  // 年份=1900+123=2023,月份=2代表3月

注意:Date类的大部分构造方法已过时,推荐使用LocalDateTime。


2. LocalDateTime类(Java 8+,推荐使用)

2.1 创建LocalDateTime对象
// 当前日期时间
LocalDateTime now = LocalDateTime.now();

// 指定日期时间
LocalDateTime dateTime = LocalDateTime.of(2023, 5, 15, 10, 30);

// 从字符串解析
LocalDateTime parsed = LocalDateTime.parse("2023-05-15T10:30:00");
2.2 获取年月日时分秒
LocalDateTime dt = LocalDateTime.now();

int year = dt.getYear();           // 年
int month = dt.getMonthValue();    // 月
int day = dt.getDayOfMonth();      // 日
int hour = dt.getHour();           // 时
int minute = dt.getMinute();       // 分
int second = dt.getSecond();       // 秒
2.3 获取周/月/年信息
dt.getDayOfWeek().getValue();   // 本周周几(1=周一,7=周日)
dt.getDayOfMonth();             // 本月第几天
dt.getDayOfYear();              // 当年第几天
2.4 日期运算(加减)
dt.plusDays(1);     // 加1天
dt.minusDays(1);    // 减1天
dt.plusWeeks(1);    // 加1周
dt.minusWeeks(1);   // 减1周
dt.plusMonths(1);   // 加1月
dt.minusMonths(1);  // 减1月
dt.plusYears(1);    // 加1年
dt.minusYears(1);   // 减1年
2.5 获取指定日期(周一、周日、月初、月末)
// 当前日期所在的周一
LocalDateTime monday = dt.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));

// 当前日期所在的周日
LocalDateTime sunday = dt.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));

// 当月第一天
LocalDateTime firstDay = dt.with(TemporalAdjusters.firstDayOfMonth());

// 当月最后一天
LocalDateTime lastDay = dt.with(TemporalAdjusters.lastDayOfMonth());
2.6 字符串与LocalDateTime互转
// 字符串 → LocalDateTime
String str = "2026-10-01 10:30:21";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime date = LocalDateTime.parse(str, formatter);

// LocalDateTime → 字符串
String result = dt.format(formatter);

注意:格式化字符串中yyyy-MM-dd HH:mm:ss的大小写敏感。


二、BigDecimal类(精确小数运算)

为什么需要BigDecimal?

floatdouble存在精度丢失问题,商业计算(金额等)必须使用BigDecimal。

1. 构造方法(推荐使用字符串构造)

//  不推荐:double构造可能丢失精度
BigDecimal d1 = new BigDecimal(1.99);   // 结果:1.98999999999999999...

//  推荐:字符串构造,结果精确
BigDecimal d2 = new BigDecimal("1.99"); // 结果:1.99

2. 加减乘运算

BigDecimal a = new BigDecimal("1.35");
BigDecimal b = new BigDecimal("3.22");

BigDecimal addRet = a.add(b);      // 加法
BigDecimal subRet = a.subtract(b); // 减法
BigDecimal mulRet = a.multiply(b); // 乘法

注意:运算后会生成新的BigDecimal对象,原对象不变。

3. 除法运算(需指定精度和舍入模式)

// 方式一:直接指定
BigDecimal result = a.divide(b, 4, RoundingMode.HALF_UP);  // 保留4位,四舍五入

// 方式二:使用MathContext
BigDecimal result = a.divide(b, new MathContext(4, RoundingMode.HALF_UP));

4. 常用舍入模式

模式 说明 示例
HALF_UP 四舍五入(常用) 1.5→2,1.4→1
HALF_DOWN 五以下舍,五及以上入 1.5→1,1.6→2
UP 远离零方向舍入 1.5→2,-1.5→-2
DOWN 向零方向舍入 1.5→1,-1.5→-1
CEILING 向正无穷方向舍入 1.5→2,-1.5→-1
FLOOR 向负无穷方向舍入 1.5→1,-1.5→-2

三、快速参考表

LocalDateTime常用方法速查

方法 作用
LocalDateTime.now() 获取当前时间
LocalDateTime.of(y,m,d,h,min) 创建指定时间
getYear() / getMonthValue() 获取年月
getDayOfWeek().getValue() 获取星期几
plusDays(n) / minusDays(n) 加减天数
with(TemporalAdjusters.firstDayOfMonth()) 获取当月第一天

BigDecimal常用方法速查

方法 作用
new BigDecimal("字符串") 创建精确小数
add(b) / subtract(b) 加减法
multiply(b) 乘法
divide(b, 位数, 模式) 除法(需指定精度)

四、注意事项总结

  1. Date类部分方法已过时,推荐使用LocalDateTime
  2. BigDecimal不要用double构造,用字符串构造更精确
  3. BigDecimal除法必须指定精度和舍入模式,否则无限循环小数会抛异常
  4. 日期格式化字符串大小写敏感yyyy(年)、MM(月)、HH(24小时)、hh(12小时)

更多推荐