如何在 Java 中转换带不同时区的字符串日期为时间戳

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你完成在 Java 中把字符串日期转换为不同时区时间戳的过程。我们将探讨 Java 中日期和时间处理的基础知识,并提供逐步说明,以确保你的 Java 应用程序能够在不同时区准确管理日期和时间数据。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/ObjectOrientedandAdvancedConceptsGroup -.-> java/date("Date") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/format("Format") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") java/SystemandDataProcessingGroup -.-> java/system_methods("System Methods") subgraph Lab Skills java/date -.-> lab-413976{{"如何在 Java 中转换带不同时区的字符串日期为时间戳"}} java/format -.-> lab-413976{{"如何在 Java 中转换带不同时区的字符串日期为时间戳"}} java/string_methods -.-> lab-413976{{"如何在 Java 中转换带不同时区的字符串日期为时间戳"}} java/system_methods -.-> lab-413976{{"如何在 Java 中转换带不同时区的字符串日期为时间戳"}} end

理解 Java 中的日期和时间

Java 提供了丰富的类和 API 来处理日期和时间。用于此目的的主要类有 java.util.Datejava.time.LocalDatejava.time.LocalTimejava.time.LocalDateTimejava.time.ZonedDateTime

表示日期和时间

java.util.Date 类是在 Java 中表示日期和时间的传统方式。它将日期和时间存储为一个长整型值,表示自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。

Date currentDate = new Date();
long timestamp = currentDate.getTime(); // 获取以毫秒为单位的时间戳

Java 8 中引入的 java.time 包提供了一种更现代、更灵活的处理日期和时间的方式。LocalDateLocalTimeLocalDateTime 类表示没有任何时区信息的日期和时间,而 ZonedDateTime 类表示具有特定时区的日期和时间。

LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = ZonedDateTime.now();

时区和夏令时

在处理日期和时间时,时区是一个重要的考虑因素。Java 的 ZonedDateTime 类允许你在特定时区处理日期和时间,同时考虑夏令时 (DST) 的变化。

graph TD A[协调世界时 (UTC) 时间] --> B[时区] B --> C[本地时间] C --> D[夏令时]

ZoneId 类用于表示时区,ZonedDateTime 类使用 ZoneId 在 UTC 时间和本地时间之间进行转换。

ZoneId zoneId = ZoneId.of("America/New_York");
ZonedDateTime zonedDateTime = ZonedDateTime.now(zoneId);

通过理解 Java 中日期、时间和时区的概念,你可以在应用程序中有效地处理日期和时间数据。

将字符串日期转换为时间戳

在 Java 中,你经常需要将以字符串形式表示的日期转换为时间戳。在处理来自各种来源(如用户输入、数据库记录或 API 响应)的日期和时间数据时,这是一项常见的任务。

解析字符串日期

java.time.format.DateTimeFormatter 类提供了一种灵活的方式来解析日期和时间的字符串表示形式。你可以使用特定的模式创建一个格式化器,并使用它将输入字符串解析为 LocalDateLocalTimeLocalDateTime 对象。

String dateString = "2023-04-25";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(dateString, formatter);

转换为时间戳

一旦你有了 LocalDateLocalTimeLocalDateTime 对象,就可以使用 toEpochMilli() 方法将其转换为时间戳(自 Unix 纪元以来的毫秒数)。

long timestamp = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toEpochMilli();

在这个示例中,我们首先将 LocalDate 转换为当天开始时的 LocalDateTime,然后使用系统的默认时区将其转换为 ZonedDateTime,最后获取以毫秒为单位的时间戳。

处理不同的日期格式

如果输入日期字符串具有不同的格式,你可以简单地修改 DateTimeFormatter 中使用的模式。例如,要解析格式为 “MM/dd/yyyy” 的日期:

String dateString = "04/25/2023";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy");
LocalDate localDate = LocalDate.parse(dateString, formatter);
long timestamp = localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toEpochMilli();

通过了解如何解析字符串日期并将其转换为时间戳,你可以在 Java 应用程序中有效地处理日期和时间数据。

在日期转换中处理时区

在处理日期和时间时,考虑数据所表示的时区非常重要。在将字符串日期转换为时间戳时尤其如此,因为时区会影响最终结果值。

理解时区

如前所述,Java 中的 ZonedDateTime 类表示具有特定时区的日期和时间。时区用于根据地理位置调整本地时间,并且还考虑夏令时的变化。

graph TD A[协调世界时 (UTC) 时间] --> B[时区] B --> C[本地时间] C --> D[夏令时]

转换带时区的字符串日期

在将字符串日期转换为时间戳时,需要考虑输入日期的时区。你可以使用 DateTimeFormatter 类在指定日期格式的同时指定时区。

String dateString = "2023-04-25 12:00:00 America/New_York";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateString, formatter);
long timestamp = zonedDateTime.toEpochSecond() * 1000;

在此示例中,输入日期字符串包含时区标识符 “America/New_York”。DateTimeFormatter 被配置为在解析日期和时间的同时解析时区。

处理时区转换

如果输入日期所在的时区与你要使用的时区不同,则可以在将 ZonedDateTime 转换为时间戳之前将其转换为所需的时区。

ZoneId sourceZone = ZoneId.of("America/New_York");
ZoneId targetZone = ZoneId.of("Europe/Berlin");

ZonedDateTime sourceDateTime = ZonedDateTime.parse(dateString, formatter);
ZonedDateTime targetDateTime = sourceDateTime.withZoneSameInstant(targetZone);

long timestamp = targetDateTime.toEpochSecond() * 1000;

在此示例中,我们首先使用 “America/New_York” 时区将输入日期字符串解析为 ZonedDateTime 对象。然后,我们使用 withZoneSameInstant() 方法将 ZonedDateTime 转换为 “Europe/Berlin” 时区,该方法确保时间点保持不变。最后,我们将 ZonedDateTime 转换为时间戳。

通过了解在将字符串日期转换为时间戳时如何处理时区,你可以确保日期和时间数据在不同时区之间准确且一致。

总结

在本 Java 教程中,你已经学习了如何在处理不同时区的同时将字符串日期转换为时间戳。通过理解 Java 中的日期和时间概念,并应用适当的技术,你可以在 Java 应用程序中有效地管理日期和时间数据,确保在多个时区中准确且一致地处理数据。