1. Overview
1.概述
In this quick tutorial, we’ll see how to set the time zone of a date using Java 7, Java 8 and the Joda-Time library.
在这个快速教程中,我们将看到如何使用Java 7、Java 8和Joda-Time库来设置一个日期的时区。
2. Using Java 8
2.使用Java 8
Java 8 introduced a new Date-Time API for working with dates and times which was largely based off of the Joda-Time library.
Java 8 引入了一个新的日期-时间 API,用于处理日期和时间,该 API 主要基于 Joda-Time 库。
The Instant class from Java Date Time API models a single instantaneous point on the timeline in UTC. This represents the count of nanoseconds since the epoch of the first moment of 1970 UTC.
Java Date Time API中的Instant类在UTC的时间轴上模拟了一个单一的瞬时点。这表示自1970年UTC第一时刻的纪元以来的纳秒数。
First, we’ll obtain the current Instant from the system clock and ZoneId for a time zone name:
首先,我们将从系统时钟中获得当前的Instant,以及ZoneId的时区名称。
Instant nowUtc = Instant.now();
ZoneId asiaSingapore = ZoneId.of("Asia/Singapore");
Finally, the ZoneId and Instant can be utilized to create a date-time object with time-zone details. The ZonedDateTime class represents a date-time with a time-zone in the ISO-8601 calendar system:
最后,ZoneId和Instant可以被用来创建一个带有时区细节的日期时间对象。ZonedDateTime类代表一个带有ISO-8601日历系统中的时区的日期时间。
ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);
We’ve used Java 8’s ZonedDateTime to represent a date-time with a time zone.
我们使用Java 8的ZonedDateTime来表示一个带有时区的日期时间。
3. Using Java 7
3.使用Java 7
In Java 7, setting the time-zone is a bit tricky. The Date class (which represents a specific instant in time) doesn’t contain any time zone information.
在Java 7中,设置时区是有点麻烦的。Date类(表示时间上的一个特定瞬间)不包含任何时区信息。
First, let’s get the current UTC date and a TimeZone object:
首先,让我们获得当前的UTC日期和一个TimeZone对象。
Date nowUtc = new Date();
TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);
In Java 7, we need to use the Calendar class to represent a date with a time zone.
在Java 7中,我们需要使用Calendar类来表示一个带有时区的日期。
Finally, we can create a nowUtc Calendar with the asiaSingapore TimeZone and set the time:
最后,我们可以用亚洲新加坡时区创建一个nowUtc日历并设置时间。
Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
nowAsiaSingapore.setTime(nowUtc);
It’s recommended to avoid the Java 7 date time API in favor of Java 8 date time API or the Joda-Time library.
建议避免使用Java 7的日期时间API,而使用Java 8的日期时间API或Joda-Time库。
4. Using Joda-Time
4.使用Joda-Time
If Java 8 isn’t an option, we can still get the same kind of result from Joda-Time, a de-facto standard for date-time operations in the pre-Java 8 world.
如果Java 8不是一个选项,我们仍然可以从Joda-Time获得同样的结果,这是在Java 8之前的世界中用于日期-时间操作的事实标准。
First, we need to add the Joda-Time dependency to pom.xml:
首先,我们需要将Joda-Time依赖性添加到pom.xml:中。
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
To represent an exact point on the timeline we can use Instant from org.joda.time package. Internally, the class holds one piece of data, the instant as milliseconds from the Java epoch of 1970-01-01T00:00:00Z:
为了表示时间线上的一个确切的点,我们可以使用Instant从org.joda.time包中获得。在内部,该类持有一个数据,即从1970-01-01T00:00:00Z这个Java纪元开始的毫秒级的瞬间。
Instant nowUtc = Instant.now();
We’ll use DateTimeZone to represent a time-zone (for the specified time zone id):
我们将使用DateTimeZone来表示一个时区(对于指定的时区ID)。
DateTimeZone asiaSingapore = DateTimeZone.forID("Asia/Singapore");
Now the nowUtc time will be converted to a DateTime object using the time zone information:
现在,nowUtc时间将使用时区信息被转换为DateTime对象。
DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);
This is how Joda-time API can be used to combine date and time zone information.
这就是如何使用Joda-time API来结合日期和时区信息。
5. Conclusion
5.总结
In this article, we found out how to set the time zone in Java using Java 7, 8 and Joda-Time API. To learn more about Java 8’s date-time support check out our Java 8 date-time intro.
在这篇文章中,我们发现了如何使用Java 7、8和Joda-Time API在Java中设置时区。要了解更多关于Java 8的日期时间支持,请查看我们的Java 8日期时间介绍。
As always the code snippet is available in the GitHub repository.
一如既往,代码片段可在GitHub资源库中找到。