1. 方法定义

@Deprecated
public static long parse(String s)
  • 所属类java.util.Date
  • 参数s - 表示日期的字符串
  • 返回值long 类型,表示自 1970年1月1日 00:00:00 GMT 以来的毫秒数
  • 功能:尝试将字符串解析为日期

2. 功能说明

  • 解析多种格式的日期字符串(无明确格式规范)
  • 支持格式示例:
    • "Sat, 12 Aug 1995 13:30:00 GMT"
    • "08/12/1995"
    • "August 12, 1995"
  • 底层使用启发式规则解析,行为不可预测

3. 示例代码(已废弃方法)

public class DeprecatedDateParse {
    public static void main(String[] args) {
        // 已废弃的解析方式(不推荐)
        long timestamp = Date.parse("August 12, 1995");
        System.out.println("解析结果: " + new Date(timestamp));
        
        // 输出可能因环境而异(如:Sat Aug 12 00:00:00 CST 1995)
    }
}

4. 推荐替代方案

方案1:使用 SimpleDateFormat(Java 1.1+)
import java.text.SimpleDateFormat;
import java.util.Date;

public class SafeDateParse {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd, yyyy");
        Date date = sdf.parse("August 12, 1995");  // 明确指定格式
        
        System.out.println("安全解析: " + date);
        System.out.println("时间戳: " + date.getTime());
    }
}
方案2:使用 Java 8+ java.time API(最佳实践)
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class ModernDateParse {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy");
        LocalDate date = LocalDate.parse("August 12, 1995", formatter);
        
        // 转换为时间戳(需指定时区)
        long timestamp = date.atStartOfDay(ZoneId.systemDefault())
                             .toInstant()
                             .toEpochMilli();
                             
        System.out.println("现代解析: " + date);
        System.out.println("时间戳: " + timestamp);
    }
}

5. 常见错误

  1. 使用废弃方法导致意外结果

    // 不同JDK版本解析结果可能不同
    Date.parse("07/08/2023");  // 可能是7月8日或8月7日
    
  2. 忽略时区问题

    // 默认使用系统时区解析
    new SimpleDateFormat("yyyy-MM-dd").parse("2023-01-01");
    // 可能因时区导致时间戳误差
    
  3. 线程安全问题

    // SimpleDateFormat 非线程安全
    public static final SimpleDateFormat SDF = new SimpleDateFormat(); // 危险!
    

6. 注意事项

  1. 弃用原因

    • 解析规则不透明(依赖实现)
    • 不支持本地化
    • 时区处理模糊
    • 无法指定格式
  2. 时区陷阱

    • Date.parse() 默认使用 GMT
    • SimpleDateFormat 默认使用系统时区
    • 始终显式设置时区:
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
      
  3. 格式敏感性

    • 格式必须精确匹配(包括空格/标点)
    • 错误示例:
      new SimpleDateFormat("yyyy-MM-dd").parse("2023/01/01"); // ParseException
      

7. 最佳实践

  1. 弃用方法处理

    • 遗留代码:替换为 SimpleDateFormat
    • 新代码:使用 java.time.LocalDate/DateTimeFormatter
  2. 线程安全方案

    // 每个线程独立实例(推荐)
    private static final ThreadLocal<SimpleDateFormat> threadLocalSDF =
        ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
    
    // 或使用 DateTimeFormatter(线程安全)
    DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
    
  3. 错误处理

    try {
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(input);
    } catch (ParseException e) {
        // 必须处理解析失败
        System.err.println("无效日期格式: " + input);
    }
    
  4. 性能优化

    • 重用 SimpleDateFormat 实例(配合 ThreadLocal
    • 预编译正则表达式(如需要预处理字符串)