在 Java 中将时间戳转换为日期

导航至

当使用任何编程语言(如 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 和医疗保健行业拥有构建产品的经验。