在 Java 中将时间戳转换为日期
作者:社区 / 开发者
2024 年 5 月 7 日
导航至
当使用任何编程语言(如 Java)时,您都将不得不时不时地处理日期和时间。例如,您可能会遇到必须将时间戳转换为日期的情况。
在这篇文章中,我们将帮助您理解 Java 中时间戳和日期的细微差别。您将了解 Java 中的时间戳和日期是什么,何时以及如何使用它们,以及如何将一个转换为另一个。
Java 中的时间戳和日期是什么?
首先,让我们确定 Java 中时间戳和日期之间的区别。在 Java 中,时间戳表示时间中的特定实例。此实例的精度高达纳秒。您通常会使用时间戳来记录事件或时刻的发生。
另一方面,Java 中的日期通常指的是 java.util.Date 的实例。此实例保存自 UNIX 纪元(1970 年 1 月 1 日,00:00:00 GMT)以来的毫秒数。时间戳为您提供时间中的确切时刻,而日期为您提供自特定日期以来经过的时间。
何时应该使用时间戳和日期?
现在,让我们了解两者在应用和用法方面的区别。当您需要精确的时刻时,应使用时间戳,精度通常可达纳秒。这可能意味着您希望记录系统中事件发生的准确时刻的情况。
例如,假设您使用后端 API 注册用户并在用户表中创建记录。此记录可以有一个名为 createdOn 的字段。此字段可以是表示创建此用户记录的确切时刻的时间戳。
反过来,createdOn 表示用户何时注册。与时间戳相反,当您需要表示日期、月份和年份而不需要如此高的精度时,应使用日期。例如,假设您想显示用户何时在您的博客网站上发布了博客。您可以使用日期来表示博客的发布时间,而您不需要为此使用高精度。
在 Java 中将时间戳转换为日期
现在让我们看一些如何在 Java 中将时间戳转换为日期的示例。
使用 java.sql.Timestamp 类
Java 提供了一个 java.sql.Timestamp 类,您可以使用它将时间戳转换为日期。此类扩展了 java.util.Date,使转换变得简单直接。
import java.sql.Timestamp;
import java.util.Date;
public class TimestampToDateExample {
` public static void main(String[] args) {`
` // 创建当前时间戳`
` Timestamp timestamp = new Timestamp(System.currentTimeMillis());`
` // 转换为日期`
` // getTime() 方法从 UNIX 纪元获取以毫秒为单位的时间`
` Date date = new Date(timestamp.getTime());`
` // 输出转换后的日期`
` System.out.println(“Date: “ + date);`
` }`
}
在上面的代码中,我们使用 Timestamp(System.currentTimeMillis()) 创建一个新的时间戳,表示当前时间。然后,我们使用 timestamp.getTime() 来检索时间戳从 UNIX 纪元开始的毫秒数。之后,我们使用此值创建一个 Date 对象。如果您运行上面的代码,您应该会得到一个新的时间戳,该时间戳已转换为当前日期,如下所示
使用 java.util.Date 类
对于更直接的方法,您也可以直接使用 java.util.Date。这是一个示例
import java.util.Date;
public class CurrentTimestampToDate {
` public static void main(String[] args) {`
` // 当前时间戳(以毫秒为单位)`
` long currentTimeMillis = System.currentTimeMillis();`
` // 转换为日期`
` Date date = new Date(currentTimeMillis);`
` // 输出日期`
` System.out.println(“Date: “ + date);`
` }`
}
在上面的代码中,我们使用 System.currentTimeMillis() 来提供自 UNIX 纪元以来的当前时间(以毫秒为单位)。然后,我们使用这些毫秒来直接实例化一个 Date 对象。上面的代码应该为您提供与前面示例中所示相同的输出。
将特定时间戳转换为日期
假设您要转换特定时间戳而不是当前时间戳。为此,我们可以使用相同的 new Timestamp(1672531200000L) 方法并将特定时间戳值传递给它。
它为特定时刻创建一个时间戳(此处表示为自 UNIX 纪元以来的毫秒数)。与之前的示例一样,getTime() 提取用于日期转换的毫秒数。
import java.sql.Timestamp;
import java.util.Date;
public class SpecificTimestampToDate {
` public static void main(String[] args) {`
` // 特定时间戳`
` Timestamp specificTimestamp = new Timestamp(1672531200000L);`
` // 转换为日期`
` Date date = new Date(specificTimestamp.getTime());`
` // 输出日期`
` System.out.println(“Date: “ + date);`
` }`
}
当您运行上面的代码时,您应该会得到该特定时间戳的日期,如下所示
时间戳到日期转换中的时区意识
在 Java 中处理时间戳和日期时,理解时区至关重要。主要挑战是 java.util.Date 以 UTC 时间表示时间,但您的应用程序可能需要以不同的时区显示它。例如,假设您以 UTC 格式存储日期,但您的用户位于 EST 时区。在这种情况下,您可能需要以 EST 格式显示和呈现日期。让我们看一个示例,其中我们获取当前日期并将其格式化为 UTC 和 EST。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
public class TimeZoneExample {
` public static void main(String[] args) {`
` // 当前时间的时间戳`
` long currentTimeMillis = System.currentTimeMillis();`
` Date currentDate = new Date(currentTimeMillis);`
` // 以 UTC 格式格式化日期`
` SimpleDateFormat sdfUTC = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);`
` sdfUTC.setTimeZone(TimeZone.getTimeZone(“UTC”));`
` System.out.println(“Date in UTC: “ + sdfUTC.format(currentDate));`
` // 以美国东部标准时间 (EST) 格式格式化日期`
` SimpleDateFormat sdfEST = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);`
` sdfEST.setTimeZone(TimeZone.getTimeZone(“EST”));`
` System.out.println(“Date in EST: “ + sdfEST.format(currentDate));`
` }`
}
我们使用了前面示例的方法来获取当前日期。然后,我们使用 SimpleDateFormat 以 UTC 和 EST 格式格式化日期。如果您运行上面的代码,您应该会看到以 UTC 和 EST 格式打印的当前日期
时间戳到日期转换中的异常处理
从 API 调用到数据处理,再到像日期和时间转换这样简单的操作,异常处理都是必不可少的。正确的异常处理可确保代码的健壮性。让我们看看如何处理常见异常,尤其是在处理转换时。
处理 NumberFormatException
与时间戳相关的常见异常是 NumberFormatException。当尝试将字符串转换为数字格式(如 long,通常用于时间戳创建)时,会发生此异常。这是一个示例
import java.util.Date;
public class ExceptionHandlingExample {
` public static void main(String[] args) {`
` try {`
` String timestampString = “invalidNumber”;`
` long timestamp = Long.parseLong(timestampString);`
` Date date = new Date(timestamp);`
` System.out.println(“Date: “ + date);`
` } catch (NumberFormatException e) {`
` System.err.println(“无效的时间戳格式: “ + e.getMessage());`
` }`
` }`
}
在上面的代码中,我们尝试将无效字符串解析为 long。NumberFormatException 被捕获,并打印错误消息。因此,程序不会崩溃,而是通知用户格式无效。如果您运行上面的代码,您应该会在控制台上打印错误消息,如下所示:
处理 DateTimeParseException
解析日期和时间字符串时可能发生的另一个常见异常是 DateTimePaseException。这在 Java 8 时间 API 中尤其常见。
import java.time.Instant;
import java.time.format.DateTimeParseException;
public class DateTimeParseExceptionHandling {
` public static void main(String[] args) {`
` try {`
` String invalidInstant = “2024-01-32T10:15:30.00Z”; // 无效日期`
` Instant parsedInstant = Instant.parse(invalidInstant);`
` System.out.println(“解析后的 Instant: “ + parsedInstant);`
` } catch (DateTimeParseException e) {`
` System.err.println(“解析日期时间失败: “ + e.getMessage());`
` }`
` }`
}
在上面的代码中,我们尝试将无效的日期时间字符串解析为 Instant。然后,我们在 catch 块中捕获 DateTimeParseException,并报告解析失败,而不是意外终止。如果您运行上面的代码,您应该会在控制台上打印错误消息,如下所示:
最佳实践
以下是一些最佳实践,可帮助您入门。
- 如果您使用的是较新的 Java 版本,请使用 java.time API。
- 对于任何与时间戳和日期相关的操作,首选 Java 8 Time API。
- 此外,为了获得健壮的代码和线程安全性,请尝试使用不可变对象。
- 此外,请确保您不要避免异常处理,尤其是在处理时间戳和日期对象时。
- 最后,请注意时区。不考虑时区可能会给您的用户造成混淆。请确保在计算、打印和存储时间戳和日期对象时考虑时区。
结论
在这篇文章中,我们学习了如何使用一些实用且有意义的示例在 Java 中将时间戳转换为日期。请记住在您的下一个 Java 项目中将时间戳转换为日期时遵循最佳实践。
这篇文章由 Siddhant Varma 撰写。Siddhant 是一位全栈 JavaScript 开发人员,在前端工程方面拥有专业知识。他曾与印度多家初创公司合作进行扩展,并在 Ed-Tech 和医疗保健行业拥有构建产品的经验。