Java常用API:Date、LocalDateTime、StringBuilder、BigDecimal

1. Date类

1.1 概述

java.util.Date是Java早期提供的日期时间处理类,用于表示特定的瞬间,精确到毫秒。但由于其设计存在缺陷(如线程不安全、API设计混乱等),Java 8之后推荐使用java.time包下的新API(如LocalDateTime)替代。

1.2 常用方法

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        // 创建当前时间的Date对象
        Date now = new Date();
        System.out.println("当前时间: " + now); // 输出格式: Wed Aug 20 12:40:00 CST 2025
        
        // 获取自1970年1月1日00:00:00 GMT以来的毫秒数
        long timeMillis = now.getTime();
        System.out.println("时间戳: " + timeMillis); // 输出类似: 1724124000000
        
        // 比较两个日期
        Date anotherDate = new Date(timeMillis - 86400000); // 前一天
        boolean isAfter = now.after(anotherDate);
        boolean isBefore = now.before(anotherDate);
        System.out.println("now在anotherDate之后: " + isAfter); // true
        System.out.println("now在anotherDate之前: " + isBefore); // false
    }
}

1.3 日期格式化

使用SimpleDateFormat进行日期格式化(注意:该类线程不安全):

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFormatExample {
    public static void main(String[] args) {
        Date now = new Date();
        
        // 创建格式化对象,指定格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        // 格式化日期为字符串
        String formattedDate = sdf.format(now);
        System.out.println("格式化后的日期: " + formattedDate); // 输出: 2025-08-20 12:40:00
        
        try {
            // 解析字符串为日期对象
            Date parsedDate = sdf.parse("2025-08-20 12:40:00");
            System.out.println("解析后的日期: " + parsedDate);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. LocalDateTime类

2.1 概述

java.time.LocalDateTime是Java 8引入的日期时间API,位于java.time包下(称为新时间日期API)。它表示日期和时间,不包含时区信息,是不可变的且线程安全的。相比Date类,它提供了更丰富的功能和更清晰的API。

2.2 常用方法

2.2.1 创建LocalDateTime对象
import java.time.LocalDateTime;

public class LocalDateTimeExample {
    public static void main(String[] args) {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();
        System.out.println("当前日期时间: " + now); // 输出类似: 2025-08-20T12:40:00
        
        // 指定日期时间创建
        LocalDateTime specificTime = LocalDateTime.of(2025, 8, 20, 12, 40, 0);
        System.out.println("指定日期时间: " + specificTime); // 输出: 2025-08-20T12:40:00
    }
}
2.2.2 时间增减操作
import java.time.LocalDateTime;

public class LocalDateTimeModifyExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        // 增加1年
        LocalDateTime nextYear = now.plusYears(1);
        // 减少2个月
        LocalDateTime minusTwoMonths = now.minusMonths(2);
        // 增加3天
        LocalDateTime plusThreeDays = now.plusDays(3);
        // 减少4小时
        LocalDateTime minusFourHours = now.minusHours(4);
        
        System.out.println("当前时间: " + now);
        System.out.println("增加1年后: " + nextYear);
        System.out.println("减少2个月后: " + minusTwoMonths);
        System.out.println("增加3天后: " + plusThreeDays);
        System.out.println("减少4小时后: " + minusFourHours);
    }
}
2.2.3 获取日期时间字段
import java.time.LocalDateTime;

public class LocalDateTimeGetExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        int year = now.getYear();
        int month = now.getMonthValue(); // 1-12
        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);
    }
}
2.2.4 格式化与解析
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class LocalDateTimeFormatExample {
    public static void main(String[] args) {
        LocalDateTime now = LocalDateTime.now();
        
        // 创建格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        // 格式化
        String formattedDateTime = now.format(formatter);
        System.out.println("格式化后的日期时间: " + formattedDateTime); // 输出: 2025-08-20 12:40:00
        
        // 解析
        LocalDateTime parsedDateTime = LocalDateTime.parse("2025-08-20 12:40:00", formatter);
        System.out.println("解析后的日期时间: " + parsedDateTime); // 输出: 2025-08-20T12:40
    }
}

2.3 LocalDate与LocalTime

LocalDate仅表示日期(年、月、日),LocalTime仅表示时间(时、分、秒、纳秒),用法与LocalDateTime类似。

import java.time.LocalDate;
import java.time.LocalTime;

public class LocalDateLocalTimeExample {
    public static void main(String[] args) {
        // LocalDate示例
        LocalDate today = LocalDate.now();
        System.out.println("当前日期: " + today); // 输出类似: 2025-08-20
        
        // LocalTime示例
        LocalTime nowTime = LocalTime.now();
        System.out.println("当前时间: " + nowTime); // 输出类似: 12:40:00.123
    }
}

3. StringBuilder类

3.1 概述

java.lang.StringBuilder是一个可变的字符序列,用于高效地进行字符串拼接操作。与String类不同,StringBuilder的对象可以被多次修改,而不会创建新的对象,因此在频繁进行字符串拼接时性能更优。

3.2 与String的+号拼接的区别

  • String: 不可变对象,每次使用+号拼接字符串都会创建新的String对象,导致内存开销大,性能差。
  • StringBuilder: 可变对象,所有修改操作都是在原对象上进行,不会创建新对象,性能更好,尤其适合频繁拼接的场景。

3.3 常用方法

public class StringBuilderExample {
    public static void main(String[] args) {
        // 创建StringBuilder对象
        StringBuilder sb = new StringBuilder();
        
        // append(): 添加内容到末尾
        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        System.out.println("append后: " + sb.toString()); // 输出: Hello World
        
        // insert(): 在指定位置插入内容
        sb.insert(5, ", Java"); // 在索引5处插入", Java"
        System.out.println("insert后: " + sb.toString()); // 输出: Hello, Java World
        
        // replace(): 替换指定范围的内容
        sb.replace(7, 11, "Python"); // 替换索引7-11的内容为"Python"
        System.out.println("replace后: " + sb.toString()); // 输出: Hello, Python World
        
        // delete(): 删除指定范围的内容
        sb.delete(5, 7); // 删除索引5-7的内容
        System.out.println("delete后: " + sb.toString()); // 输出: Hello Python World
        
        // reverse(): 反转字符串
        sb.reverse();
        System.out.println("reverse后: " + sb.toString()); // 输出: dlroW nohtyP olleH
        
        // 链式调用
        StringBuilder chainSB = new StringBuilder()
            .append("Java")
            .append(" ")
            .append("StringBuilder")
            .append(" ")
            .append("链式调用");
        System.out.println("链式调用结果: " + chainSB.toString()); // 输出: Java StringBuilder 链式调用
    }
}

4. BigDecimal类

4.1 概述

java.math.BigDecimal用于高精度的浮点数运算,可以解决doublefloat类型的浮点数运算时出现的精度丢失问题,特别适合财务计算等对精度要求高的场景。

4.2 构造方法

推荐使用BigDecimal(String val)构造方法,避免使用BigDecimal(double val),因为double类型可能存在精度问题。

import java.math.BigDecimal;

public class BigDecimalConstructorExample {
    public static void main(String[] args) {
        // 推荐: 使用String构造
        BigDecimal bd1 = new BigDecimal("0.1");
        // 不推荐: 使用double构造,可能存在精度问题
        BigDecimal bd2 = new BigDecimal(0.1);
        
        System.out.println("bd1: " + bd1); // 输出: 0.1
        System.out.println("bd2: " + bd2); // 输出: 0.1000000000000000055511151231257827021181583404541015625
    }
}

4.3 常用方法

import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("10.5");
        BigDecimal b = new BigDecimal("3");
        
        // 加法
        BigDecimal sum = a.add(b);
        System.out.println("和: " + sum); // 输出: 13.5
        
        // 减法
        BigDecimal difference = a.subtract(b);
        System.out.println("差: " + difference); // 输出: 7.5
        
        // 乘法
        BigDecimal product = a.multiply(b);
        System.out.println("积: " + product); // 输出: 31.5
        
        // 除法(设置精度和舍入模式)
        BigDecimal quotient = a.divide(b, 2, RoundingMode.HALF_UP); // 保留2位小数,四舍五入
        System.out.println("商: " + quotient); // 输出: 3.50
        
        // 设置精度和舍入模式
        BigDecimal rounded = a.setScale(0, RoundingMode.HALF_UP); //将10.5变更为保留0位小数(不保留),且四舍五入
        System.out.println("四舍五入取整: " + rounded); // 输出: 11
    }
}

4.4 注意事项

  • 避免使用double构造BigDecimal,应使用String构造。
  • 进行除法运算时,必须指定精度和舍入模式,避免ArithmeticException
  • 常用的舍入模式:RoundingMode.HALF_UP(四舍五入)、RoundingMode.DOWN(截断)等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值