使用 java.util.Date 和 java.text.SimpleDateFormat (传统方式)
这是 Java 早期版本中非常经典的方式,但现在已经不推荐在新代码中使用,因为 Date 类本身设计上存在一些问题,并且不是线程安全的。

特点:
java.util.Date: 表示一个特定的瞬间,精确到毫秒。java.text.SimpleDateFormat: 用于将Date对象格式化为我们想要的字符串,或者将字符串解析为Date对象。
代码示例:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
// 1. 获取当前时间的 Date 对象
Date now = new Date();
// 2. 创建一个 SimpleDateFormat 对象,并指定格式
// yyyy: 年
// MM: 月 (注意是大写,区分于 mm: 分钟)
// dd: 日
// HH: 时 (24小时制)
// mm: 分
// ss: 秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 3. 格式化 Date 对象为字符串
String formattedDate = sdf.format(now);
System.out.println("当前时间 (SimpleDateFormat): " + formattedDate);
// 如果需要分别获取年、月、日等字段
// 可以使用 Calendar 类,但更推荐使用 Java 8 的新 API
// ...
}
}
输出示例:
当前时间 (SimpleDateFormat): 2025-10-27 15:30:55
使用 java.util.Calendar (稍作改进的方式)
Calendar 类提供了比 Date 更丰富的功能,可以方便地获取和操作日期/时间的各个字段(年、月、日等)。

特点:
java.util.Calendar: 是一个抽象类,它提供了将Date对象转换为一组日历字段(如YEAR,MONTH,DAY_OF_MONTH等)的方法。- 月份是从 0 开始的(0 代表一月),这一点需要特别注意。
代码示例:
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
// 1. 获取一个 Calendar 实例(默认使用当前时间和默认时区)
Calendar calendar = Calendar.getInstance();
// 2. 获取各个字段
// 注意:月份是从 0 开始的,所以需要 +1
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份需要 +1
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
// 3. 打印结果
System.out.println("当前时间 (Calendar):");
System.out.println("年: " + year);
System.out.println("月: " + month);
System.out.println("日: " + day);
System.out.println("时: " + hour);
System.out.println("分: " + minute);
System.out.println("秒: " + second);
// 也可以组合成字符串
String formattedString = String.format("%04d-%02d-%02d %02d:%02d:%02d",
year, month, day, hour, minute, second);
System.out.println("格式化字符串: " + formattedString);
}
}
输出示例:
当前时间 (Calendar):
年: 2025
月: 10
日: 27
时: 15
分: 31
秒: 5
格式化字符串: 2025-10-27 15:31:05
使用 Java 8+ 的 java.time API (强烈推荐)
自 Java 8 引入了全新的 java.time 包,这是目前处理日期和时间的最佳实践,它设计更优秀、更易用、更安全(不可变且线程安全)。
java.time 包中包含多个核心类,用于不同的场景:
LocalDateTime: 表示不带时区的日期和时间(最常用)。ZonedDateTime: 表示带有时区的日期和时间。LocalDate: 只表示日期。LocalTime: 只表示时间。
使用 LocalDateTime 获取年月日时分秒:
这是最直接、最推荐的方式。
代码示例:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Java8TimeExample {
public static void main(String[] args) {
// 1. 获取当前日期和时间 (不带时区)
LocalDateTime now = LocalDateTime.now();
// 2. 分别获取各个字段
int year = now.getYear();
int month = now.getMonthValue(); // getMonthValue() 返回 1-12,无需 +1
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("当前时间 (LocalDateTime):");
System.out.println("年: " + year);
System.out.println("月: " + month);
System.out.println("日: " + day);
System.out.println("时: " + hour);
System.out.println("分: " + minute);
System.out.println("秒: " + second);
// 3. 使用 DateTimeFormatter 格式化输出
// 这种方式比 SimpleDateFormat 更简洁、更安全
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = now.format(formatter);
System.out.println("\n格式化字符串: " + formattedDateTime);
}
}
输出示例:
当前时间 (LocalDateTime):
年: 2025
月: 10
日: 27
时: 15
分: 32
秒: 10
格式化字符串: 2025-10-27 15:32:10
总结与对比
| 特性 | java.util.Date |
java.util.Calendar |
java.time (Java 8+) |
|---|---|---|---|
| 推荐度 | 不推荐 | 不推荐 | 强烈推荐 |
| 线程安全 | 否 | 否 | 是 (所有核心类都是不可变的) |
| 易用性 | 一般 (需配合 SimpleDateFormat) |
较好 | 非常好 (API 设计清晰) |
| 月份表示 | 无直接方法,需用 Calendar |
从 0 开始 (0代表一月) | 从 1 开始 (符合直觉) |
| 现代功能 | 无 | 无 | 支持,如时区、Duration、Period 等 |
| 核心类 | Date, SimpleDateFormat |
Calendar |
LocalDateTime, ZonedDateTime, DateTimeFormatter |
- 对于新项目:请毫不犹豫地使用 Java 8+ 的
java.timeAPI,它是现代 Java 开发的标准,代码更简洁、更健壮。 - 对于维护旧项目:你可能会遇到
Date和Calendar,了解它们的工作原理是必要的,但在新代码中应尽量避免使用。 - 注意:如果你需要处理数据库,JDBC 4.2+ 也已经完全支持
java.time类型,可以直接与数据库交互。
