✅ 一、DateString(格式化)

Date 对象格式化为 yyyy-MM-dd HH:mm:ss 格式的字符串。

✅ 操作步骤(非常详细)

  1. 导入必要的类
  2. 创建 SimpleDateFormat 实例,并指定格式
  3. 调用 format() 方法进行转换
  4. 输出或使用结果字符串

✅ 代码示例

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

public class DateToStringExample {
    public static void main(String[] args) {
        // 1. 获取当前时间
        Date now = new Date(); // 当前时间

        // 2. 定义格式化器,指定格式 yyyy-MM-dd HH:mm:ss
        // 注意:MM 是月份,mm 是分钟,HH 是24小时制小时
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

        // 3. 格式化 Date 为字符串
        String formattedDate = sdf.format(now);

        // 4. 输出结果
        System.out.println("格式化后的时间: " + formattedDate);
        // 示例输出:2025-08-15 10:45:30
    }
}

✅ 二、StringDate(解析)

将格式为 yyyy-MM-dd HH:mm:ss 的字符串解析为 Date 对象。

✅ 操作步骤

  1. 准备一个符合格式的字符串
  2. 创建相同格式的 SimpleDateFormat
  3. 调用 parse() 方法
  4. 处理可能抛出的 ParseException

✅ 代码示例

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

public class StringToDateExample {
    public static void main(String[] args) {
        // 1. 准备字符串
        String dateString = "2025-08-15 10:45:30";

        // 2. 创建格式化器(格式必须与字符串完全匹配)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);

        try {
            // 3. 解析字符串为 Date 对象
            Date parsedDate = sdf.parse(dateString);

            // 4. 输出结果(默认 toString() 会显示完整时间)
            System.out.println("解析后的 Date: " + parsedDate);
            // 输出示例:Fri Aug 15 10:45:30 CST 2025
        } catch (ParseException e) {
            System.err.println("日期解析失败:字符串格式不匹配");
            e.printStackTrace();
        }
    }
}

⚠️ 常见错误与注意事项

问题 说明 解决方案
格式不匹配 字符串是 2025/08/15,但格式写成 - 会失败 确保 SimpleDateFormat 的模式与字符串完全一致
大小写错误 hh(12小时制)vs HH(24小时制),mm(分钟)vs MM(月份) 记住:HH 表示24小时,mm 表示分钟,ss 表示秒
未处理异常 parse() 抛出 ParseException 必须用 try-catch 包裹
线程不安全 SimpleDateFormat 不是线程安全的 不要在多线程中共享同一个实例

🛡️ 最佳实践:线程安全方案

由于 SimpleDateFormat 不是线程安全的,在高并发场景下(如 Web 服务)共享它会导致数据错乱。

✅ 推荐做法 1:使用 ThreadLocal

private static final ThreadLocal<SimpleDateFormat> DATE_FORMATTER = 
    ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

// 使用
public String format(Date date) {
    return DATE_FORMATTER.get().format(date);
}

public Date parse(String dateString) throws ParseException {
    return DATE_FORMATTER.get().parse(dateString);
}

✅ 推荐做法 2:使用 Java 8+ 的 DateTimeFormatter(强烈推荐)

✅ 线程安全 ✅ 更现代 ✅ 性能更好

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;

// 1. Date -> String
Date date = new Date();
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = ldt.format(formatter);

// 2. String -> Date
String str = "2025-08-15 10:45:30";
LocalDateTime ldt2 = LocalDateTime.parse(str, formatter);
Date resultDate = java.util.Date.from(ldt2.atZone(ZoneId.systemDefault()).toInstant());

📌 总结:快速掌握要点

转换方向 方法 关键代码
DateString sdf.format(date) "yyyy-MM-dd HH:mm:ss"
StringDate sdf.parse(str) 必须 try-catch
推荐替代方案 java.time.LocalDateTime + DateTimeFormatter 线程安全、更清晰

✅ 一句话记住格式:

yyyy-MM-dd HH:mm:ss

  • y=年,M=月,d=日
  • H=小时(24小时制),m=分钟,s=秒
  • 连字符 - 和冒号 : 是分隔符,必须匹配