在 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);`

` }`

}

在上面的代码中,我们使用 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);`

` }`

}

In the above code, we use System.currentTimeMillis() to provide the current time in milliseconds since the UNIX epoch. Then, we use these milliseconds to instantiate a Dateobject directly. The above code should give you the same output as shown in the previous example.

将特定时间戳转换为日期

假设您想将特定的时间戳转换为日期而不是当前时间戳。为此,我们可以使用相同的 new Timestamp(1672531200000L) 方法,并将特定的时

间戳值传递给它。

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);`

` }`

}

当你运行上面的代码时,你应该得到那个特定时间戳的日期,如下所示

时间戳到日期转换中的时区感知

在处理 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(“UTC 日期: “ + sdfUTC.format(currentDate));`

` // 以东部标准时间 (EST) 格式化日期`

` SimpleDateFormat sdfEST = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);`

` sdfEST.setTimeZone(TimeZone.getTimeZone(“EST”));`

` System.out.println(“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);`

` } catch (NumberFormatException e) {`

` System.err.println(“无效的时间戳格式: “ + e.getMessage());`

` }`

` }`

}

在上面的代码中,我们尝试将一个无效的字符串解析为长整型。捕获了NumberFormatException,并打印了一条错误消息。因此,程序不会崩溃,而是会通知用户格式无效。如果您运行上面的代码,应该在控制台上打印出以下错误消息:

处理DateTimeParseException

在解析日期和时间字符串时可能发生的另一个常见异常是DateTimeParseException。在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。然后,在捕获块中捕获DateTimeParseException,并报告解析失败,而不是意外终止。如果您运行上面的代码,应该在控制台上打印出以下错误消息:

最佳实践

以下是一些可以帮助您开始的最佳实践。

  • 如果您正在使用较新的Java版本,请使用 java.time API。
  • Java 8时间API是进行任何时间戳和日期相关操作的首选。
  • 此外,为了确保代码的健壮性和线程安全,尝试使用不可变对象。
  • 此外,确保不要忽视异常处理,尤其是在处理时间戳和日期对象时。
  • 最后,要注意时区。不考虑时区可能会使用户感到困惑。确保在计算、打印和存储时间戳和日期对象时考虑时区。

结论

在这篇文章中,我们通过一些实用的示例学习了如何在Java中将时间戳转换为日期。记住,在您的下一个Java项目中转换时间戳到日期时要遵循最佳实践。

本文由Siddhant Varma撰写。 Siddhant是一位全栈JavaScript开发者,擅长前端工程。他在印度与多家初创公司合作进行扩展,并在教育技术和医疗保健行业的产品构建方面拥有经验。