SimpleDateFormat 和 DateTimeFormatter 的异同

在Java开发中Date类型转String类型是比较常见的,其中最常用的是以下几种方式:

1. 使用SimpleDateFormat(Java 8之前)

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

public class DateToStringExample {
    public static void main(String[] args) {
        Date date = new Date();
        
        // 创建日期格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        // 格式化日期为字符串
        String dateString = sdf.format(date);
        
        System.out.println("格式化后的日期: " + dateString);
    }
}

2. 使用DateTimeFormatter(Java 8及以后) 

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

public class DateToStringJava8 {
    public static void main(String[] args) {
        Date date = new Date();
        
        // 将Date转换为LocalDateTime
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        
        // 定义格式化模式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        // 格式化
        String dateString = localDateTime.format(formatter);
        
        System.out.println("格式化后的日期: " + dateString);
    }
}

扩展: 

常用的日期格式模式

  • yyyy:四位年份
  • MM:两位月份(01-12)
  • dd:两位日期(01-31)
  • HH:24小时制的小时(00-23)
  • hh:12小时制的小时(01-12)
  • mm:分钟(00-59)
  • ss:秒(00-59)
  • SSS:毫秒(000-999)
  • a:上午/下午标记(AM/PM)

注:需要注意的这两种方式虽然都可以实现需求,但是两种方式还是有比较明显的区别的

1. 所属 API 体系不同

  • SimpleDateFormat​:

    • 属于旧的 java.text 包
    • 配合 java.util.Date 和 java.util.Calendar 使用
    • Java 1.1 引入
  • DateTimeFormatter​:

    • 属于新的 java.time.format 包
    • 配合 Java 8 引入的 java.time API (LocalDateLocalDateTime 等)使用
    • Java 8 引入

SimpleDateFormat 和 DateTimeFormatter 的区别

SimpleDateFormat 和 DateTimeFormatter 都是 Java 中用于日期时间格式化的类,但它们属于不同的 API 体系,有显著的区别:

1. 所属 API 体系不同

  • SimpleDateFormat​:

    • 属于旧的 java.text 包
    • 配合 java.util.Date 和 java.util.Calendar 使用
    • Java 1.1 引入
  • DateTimeFormatter​:

    • 属于新的 java.time.format 包
    • 配合 Java 8 引入的 java.time API (LocalDateLocalDateTime 等)使用
    • Java 8 引入

2. 线程安全性(尤其需要注意,面试会问)

  • SimpleDateFormat​:

    • 不是线程安全的
    • 多线程环境下需要同步或为每个线程创建独立实例
  • DateTimeFormatter​:

    • 线程安全
    • 可以安全地在多线程环境中共享实例

3.功能差异

  • DateTimeFormatter​ 提供更多功能:
    • 内置预定义的格式化器 (如 ISO_LOCAL_DATE)
    • 更好的本地化支持
    • 更灵活的解析和格式化选项
    • 支持解析到 TemporalAccessor 而不仅仅是特定类型

4. 异常处理

  • SimpleDateFormat​:

    • 解析失败时通常返回错误结果而不是抛出异常
    • 行为有时不一致
  • DateTimeFormatter​:

    • 解析失败时抛出 DateTimeParseException
    • 行为更加严格和一致

5. 性能

  • DateTimeFormatter​ 通常性能更好,特别是在多线程环境中

SimpleDateFormat 和 DateTimeFormatter 的区别

SimpleDateFormat 和 DateTimeFormatter 都是 Java 中用于日期时间格式化的类,但它们属于不同的 API 体系,有显著的区别:

1. 所属 API 体系不同

  • SimpleDateFormat​:

    • 属于旧的 java.text 包
    • 配合 java.util.Date 和 java.util.Calendar 使用
    • Java 1.1 引入
  • DateTimeFormatter​:

    • 属于新的 java.time.format 包
    • 配合 Java 8 引入的 java.time API (LocalDateLocalDateTime 等)使用
    • Java 8 引入

2. 线程安全性

  • SimpleDateFormat​:

    • 不是线程安全的
    • 多线程环境下需要同步或为每个线程创建独立实例
  • DateTimeFormatter​:

    • 线程安全
    • 可以安全地在多线程环境中共享实例

3. 功能差异

  • DateTimeFormatter​ 提供更多功能:
    • 内置预定义的格式化器 (如 ISO_LOCAL_DATE)
    • 更好的本地化支持
    • 更灵活的解析和格式化选项
    • 支持解析到 TemporalAccessor 而不仅仅是特定类型

4. 异常处理

  • SimpleDateFormat​:

    • 解析失败时通常返回错误结果而不是抛出异常
    • 行为有时不一致
  • DateTimeFormatter​:

    • 解析失败时抛出 DateTimeParseException
    • 行为更加严格和一致

5. 性能

  • DateTimeFormatter​ 通常性能更好,特别是在多线程环境中

6. 使用示例对比

// SimpleDateFormat 示例
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formatted = sdf.format(new Date());
Date parsed = sdf.parse("2023-11-15");

// DateTimeFormatter 示例
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = LocalDate.now().format(dtf);
LocalDate parsed = LocalDate.parse("2023-11-15", dtf);

何时使用哪个?

  • 使用 SimpleDateFormat​:

    • 维护旧代码
    • 必须与 java.util.Date 交互
    • 项目不能使用 Java 8+
  • 使用 DateTimeFormatter​:

    • 新开发项目
    • 需要线程安全
    • 需要更好的API设计和功能
    • 可以使用 Java 8+

总结

DateTimeFormatter 是更现代、更安全、功能更强大的选择,而 SimpleDateFormat 主要是为了向后兼容而保留。如果使用 Java 8 或更高版本,强烈建议使用新的 java.time API 和 DateTimeFormatter

你可能感兴趣的:(java,开发语言)