在 Java 中,将 int 类型转换为 Date 类型通常有两种主要场景:

(图片来源网络,侵删)
-
将一个表示“秒数”或“毫秒数”的
int转换为Date对象。- 这是最常见的情况,
int存储的是从 Unix 纪元(1970年1月1日 00:00:00 UTC)开始经过的秒数或毫秒数。 - 关键点:必须明确你的
int代表的是秒还是毫秒。java.util.Date的构造函数和setTime()方法都接受一个long类型的毫秒数。
- 这是最常见的情况,
-
将一个类似
YYYYMMDD格式的int转换为Date对象。- 这种情况比较特殊,
int本身不包含时间信息,只包含日期,你需要手动解析这个数字,然后构建一个Date对象。
- 这种情况比较特殊,
下面我将针对这两种场景,提供详细的代码示例和最佳实践。
int 表示秒数或毫秒数
这是最直接的方法。java.util.Date 的核心就是存储一个 long 类型的毫秒时间戳。

(图片来源网络,侵删)
int 代表毫秒数
int 变量 millisecondsSinceEpoch 存储的是从 1970 年以来的毫秒数,你可以直接将其转换为 long 并用来创建 Date 对象。
import java.util.Date;
public class IntToDateExample {
public static void main(String[] args) {
// 假设这个 int 存储的是毫秒数
int millisecondsSinceEpoch = 1672531200000; // 对应 2025-01-01 00:00:00 UTC
// 将 int 转换为 long,然后创建 Date 对象
long longValue = (long) millisecondsSinceEpoch;
Date date = new Date(longValue);
System.out.println("从毫秒数转换的 Date: " + date);
// 输出类似: 从毫秒数转换的 Date: Sat Jan 01 08:00:00 CST 2025
// 注意:输出会根据你的系统时区有所不同
}
}
int 代表秒数
int 变量 secondsSinceEpoch 存储的是秒数,你需要先将其乘以 1000 转换为毫秒。
import java.util.Date;
public class IntToDateExample {
public static void main(String[] args) {
// 假设这个 int 存储的是秒数
int secondsSinceEpoch = 1672531200; // 对应 2025-01-01 00:00:00 UTC
// 将秒数转换为毫秒 (乘以 1000L),然后创建 Date 对象
// 注意:使用 1000L 而不是 1000,可以防止整数溢出
long milliseconds = (long) secondsSinceEpoch * 1000L;
Date date = new Date(milliseconds);
System.out.println("从秒数转换的 Date: " + date);
// 输出类似: 从秒数转换的 Date: Sat Jan 01 08:00:00 CST 2025
}
}
int 表示 YYYYMMDD 格式的日期
这种情况比较复杂,因为 int 不包含分隔符,你需要将 int 转换为 String,然后解析它。强烈推荐使用 Java 8 引入的 java.time 包,它比旧的 java.util.Date 和 java.text.SimpleDateFormat 更安全、更易用。
推荐方法:使用 java.time 包 (Java 8+)
这是现代 Java 开发的首选方式。

(图片来源网络,侵删)
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class IntToDateYyyymmddExample {
public static void main(String[] args) {
// int 格式的日期,20251027 表示 2025年10月27日
int dateInt = 20251027;
// 1. 将 int 转换为 String,格式为 "yyyyMMdd"
String dateString = String.valueOf(dateInt);
// 2. 定义解析器,告诉程序字符串的格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// 3. 使用解析器将 String 解析为 LocalDate 对象
LocalDate localDate = LocalDate.parse(dateString, formatter);
System.out.println("从 YYYYMMDD int 转换的 LocalDate: " + localDate);
// 输出: 从 YYYYMMDD int 转换的 LocalDate: 2025-10-27
// 如果你仍然需要一个 java.util.Date 对象(例如为了兼容旧代码)
// 可以从 LocalDate 转换
// 注意:需要指定时区,这里使用系统默认时区
java.util.Date date = java.util.Date.from(localDate.atStartOfDay(java.time.ZoneId.systemDefault()).toInstant());
System.out.println("最终转换的 java.util.Date: " + date);
// 输出类似: 最终转换的 java.util.Date: Fri Oct 27 00:00:00 CST 2025
}
}
旧方法:使用 java.util.Date 和 SimpleDateFormat (不推荐,仅用于兼容旧代码)
这种方法在旧代码中很常见,但 SimpleDateFormat 是非线程安全的,在并发环境下容易出问题。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class IntToDateOldExample {
public static void main(String[] args) {
// int 格式的日期
int dateInt = 20251027;
// 1. 将 int 转换为 String
String dateString = String.valueOf(dateInt);
// 2. 创建 SimpleDateFormat 对象,定义格式
// !!! 警告: SimpleDateFormat 不是线程安全的 !!!
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
try {
// 3. 解析字符串为 Date 对象
Date date = formatter.parse(dateString);
System.out.println("使用旧方法转换的 Date: " + date);
// 输出类似: 使用旧方法转换的 Date: Fri Oct 27 00:00:00 CST 2025
} catch (ParseException e) {
e.printStackTrace();
}
}
}
总结与最佳实践
| 场景 | 推荐方法 | 关键代码 | 优点 |
|---|---|---|---|
int 是时间戳(秒/毫秒) |
java.util.Date |
new Date((long)seconds * 1000L) |
简单直接,适用于所有 Java 版本。 |
int 是 YYYYMMDD 格式 |
java.time.LocalDate (Java 8+) |
LocalDate.parse(String.valueOf(int), DateTimeFormatter.ofPattern("yyyyMMdd")) |
强烈推荐,API 清晰、不可变、线程安全。 |
int 是 YYYYMMDD 格式 |
java.util.Date + SimpleDateFormat |
new SimpleDateFormat("yyyyMMdd").parse(String.valueOf(int)) |
不推荐,仅用于维护无法升级到 Java 8 的旧代码。SimpleDateFormat 有线程安全问题。 |
核心建议:
- 优先使用 Java 8 的
java.timeAPI,对于任何新的日期时间处理,它都是标准且最佳的选择。 - 明确
int的含义,在转换之前,务必确认这个int数字代表的是时间戳(秒/毫秒)还是一个格式化的日期字符串(如YYYYMMDD),这是避免错误的关键。 - 处理时区。
java.util.Date会隐式地使用系统默认时区,而java.timeAPI 默认不包含时区信息,这让时间处理更加明确和可控。
