在Java中设置日期的时区

2023/06/09

1. 概述

在本快速教程中,我们将了解如何使用Java7、Java 8 和 Joda-Time 库设置日期的时区。

2. 使用Java8

Java 8 引入 了一个新的日期时间 API ,用于处理日期和时间,它主要基于 Joda-Time 库。

Java Date Time API中的Instant类模拟 UTC 时间轴上的单个瞬时点。这表示自 1970 UTC 的第一时刻以来的纳秒数。

首先,我们将从系统时钟和 ZoneId获取当前Instant 作为时区名称:

Instant nowUtc = Instant.now();
ZoneId asiaSingapore = ZoneId.of("Asia/Singapore");

最后,ZoneId和Instant 可用于创建具有时区详细信息的日期时间对象。ZonedDateTime 类表示 ISO-8601 日历系统中带有时区的日期时间

ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);

我们使用Java8 的ZonedDateTime来表示带有时区的日期时间。

3. 使用Java7

在Java7 中,设置时区有点棘手。Date类(表示特定的瞬间)不包含任何时区信息。

首先,让我们获取当前的 UTC 日期和一个 TimeZone 对象:

Date nowUtc = new Date();
TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);

在Java7 中,我们需要使用 Calendar类来表示带有时区的日期。

最后,我们可以使用 asiaSingapore TimeZone创建一个nowUtc Calendar并设置时间:

Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
nowAsiaSingapore.setTime(nowUtc);

建议避免使用Java7 日期时间 API,而使用Java8 日期时间 API 或 Joda-Time 库。

4. 使用 Joda-Time

如果Java8 不是一个选项, 我们仍然可以从 Joda-Time 获得相同类型的结果, Joda-Time是Java8 之前世界中日期时间操作的实际标准。

首先,我们需要将 [Joda-Time 依赖](https://search.maven.org/classic/#artifactdetails joda-time joda-time 2.10 jar)项添加 到pom.xml 中:
<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.10</version>
</dependency>

为了表示时间轴上的确切点,我们可以使用org.joda.time包中的Instant 。 在内部,该类保存一条数据,从 1970-01-01T00:00:00Z 的Java时代开始以毫秒为单位的瞬间:

Instant nowUtc = Instant.now();

我们将使用DateTimeZone 来表示时区(对于指定的时区 ID):

DateTimeZone asiaSingapore = DateTimeZone.forID("Asia/Singapore");

现在nowUtc 时间将使用时区信息转换为DateTime 对象:

DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);

这就是如何使用 Joda-time API 来组合日期和时区信息。

5.总结

在本文中,我们了解了如何使用Java7、8 和 Joda-Time API 在Java中设置时区。要了解有关Java8 的日期时间支持的更多信息,请查看 我们的Java8 日期时间介绍

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章