在 Java 中获取当前日期,根据你需要的精度和 API 版本(Java 8+ 推荐使用 java.time),有几种不同的方法。

如何选择?
| 场景 | 推荐的 API | 示例 |
|---|---|---|
| Java 8 及以上 (现代 Java) | java.time 包 |
LocalDate.now() |
| 需要包含时间 | java.time 包 |
LocalDateTime.now() |
| 需要包含时区 | java.time 包 |
ZonedDateTime.now() |
| Java 8 之前 (旧版 Java) | java.util 包 |
new Date() |
| 需要格式化日期 | java.time.format 包 |
DateTimeFormatter |
现代 Java 8+ (java.time 包) - 强烈推荐
Java 8 引入了全新的 java.time 包,它解决了旧版 Date 和 Calendar 的诸多问题,是处理日期和时间的标准。
a) 获取当前日期(不含时间): java.time.LocalDate
LocalDate 表示一个不带时间的日期,格式为 yyyy-MM-dd。
import java.time.LocalDate;
public class CurrentDateExample {
public static void main(String[] args) {
// 获取当前日期
LocalDate today = LocalDate.now();
System.out.println("当前日期 (LocalDate): " + today);
// 输出类似: 当前日期 (LocalDate): 2025-10-27
// 获取年、月、日
int year = today.getYear();
int month = today.getMonthValue(); // getMonth() 返回 Month 枚举
int day = today.getDayOfMonth();
System.out.println("年份: " + year);
System.out.println("月份: " + month);
System.out.println("日期: " + day);
}
}
b) 获取当前日期和时间(不含时区): java.time.LocalDateTime
LocalDateTime 表示一个不带时区的日期和时间,格式为 yyyy-MM-ddTHH:mm:ss。
import java.time.LocalDateTime;
public class CurrentDateTimeExample {
public static void main(String[] args) {
// 获取当前日期和时间
LocalDateTime now = LocalDateTime.now();
System.out.println("当前日期时间 (LocalDateTime): " + now);
// 输出类似: 当前日期时间 (LocalDateTime): 2025-10-27T10:30:55.123
// 获取年、月、日、时、分、秒
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("小时: " + hour);
System.out.println("分钟: " + minute);
System.out.println("秒: " + second);
}
}
c) 获取当前日期和时间(带时区): java.time.ZonedDateTime
ZonedDateTime 表示一个带时区的完整日期和时间。
import java.time.ZonedDateTime;
public class CurrentZonedDateTimeExample {
public static void main(String[] args) {
// 获取当前日期和时间(带系统默认时区)
ZonedDateTime nowWithZone = ZonedDateTime.now();
System.out.println("当前日期时间 (带时区): " + nowWithZone);
// 输出类似: 当前日期时间 (带时区): 2025-10-27T10:30:55.123+08:00[Asia/Shanghai]
// 获取特定时区的当前时间
ZonedDateTime nowInNewYork = ZonedDateTime.now(java.time.ZoneId.of("America/New_York"));
System.out.println("纽约当前时间: " + nowInNewYork);
}
}
旧版 Java (java.util 和 java.text)
如果你在使用 Java 8 之前的版本,或者需要与遗留代码交互,可以使用 java.util.Date 和 java.util.Calendar。
a) java.util.Date (不推荐,但常见)
Date 对象同时包含日期和时间,但其设计有很多缺陷(月份从0开始)。
import java.util.Date;
public class LegacyDateExample {
public static void main(String[] args) {
// 创建一个表示当前日期和时间的 Date 对象
Date now = new Date();
System.out.println("当前日期时间 (Date): " + now);
// 输出类似: 当前日期时间 (Date): Fri Oct 27 10:30:55 CST 2025
// 注意:Date 的月份是从 0 开始的 (0=一月, 1=二月, ...)
// 所以获取月份时需要 +1
// 获取年、月、日(这种方式不推荐,因为API已过时)
// @Deprecated
int year = now.getYear() + 1900; // getYear() 返回的是自1900年以来的年数
int month = now.getMonth() + 1; // 月份从0开始
int day = now.getDate();
System.out.println("年份: " + year);
System.out.println("月份: " + month);
System.out.println("日期: " + day);
}
}
b) java.util.Calendar (比 Date 稍好)
Calendar 是 Date 的一个更友好的包装器,但API仍然有些繁琐。
import java.util.Calendar;
public class LegacyCalendarExample {
public static void main(String[] args) {
// 获取一个 Calendar 实例,默认使用当前日期和时间
Calendar calendar = Calendar.getInstance();
System.out.println("当前日期时间 (Calendar): " + calendar.getTime());
// 输出类似: 当前日期时间 (Calendar): Fri Oct 27 10:30:55 CST 2025
// 获取年、月、日
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println("年份: " + year);
System.out.println("月份: " + month);
System.out.println("日期: " + day);
}
}
格式化日期
无论是新旧API,通常都需要将日期格式化为特定的字符串。
a) Java 8+ (java.time.format.DateTimeFormatter)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class DateFormatExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
// 定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
// 格式化日期
String formattedDate = today.format(formatter);
System.out.println("格式化后的日期: " + formattedDate);
// 输出类似: 格式化后的日期: 2025年10月27日
}
}
b) 旧版 Java (java.text.SimpleDateFormat)
import java.util.Date;
import java.text.SimpleDateFormat;
public class LegacyDateFormatExample {
public static void main(String[] args) {
Date now = new Date();
// 定义格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日");
// 格式化日期
String formattedDate = formatter.format(now);
System.out.println("格式化后的日期: " + formattedDate);
// 输出类似: 格式化后的日期: 2025年10月27日
}
}
对于任何新的 Java 项目,强烈建议使用 Java 8 引入的 java.time 包,它更直观、更安全、功能更强大,并且是未来的标准,只有在维护旧代码或与旧系统交互时,才应考虑使用 java.util.Date 和 java.util.Calendar。
