在 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);`
` }`
}
在上面的代码中,我们使用 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开发者,擅长前端工程。他在印度与多家初创公司合作进行扩展,并在教育技术和医疗保健行业的产品构建方面拥有经验。