如何设置java.util.Date的时区?
我已经从 String
解析了 java.util.Date
,但它将本地时区设置为 date
对象的时区。
解析 Date
的 String
中未指定时区。我想设置 date
对象的特定时区。
我怎样才能做到这一点?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
使用日期格式。例如,
Use DateFormat. For example,
请注意,
java.util.Date
对象本身不包含任何时区信息 - 您无法在Date
对象上设置时区。Date
对象包含的唯一内容是自“纪元” - 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。正如 ZZ Coder 所示,您在
DateFormat
对象上设置时区,以告诉它您要在哪个时区显示日期和时间。Be aware that
java.util.Date
objects do not contain any timezone information by themselves - you cannot set the timezone on aDate
object. The only thing that aDate
object contains is a number of milliseconds since the "epoch" - 1 January 1970, 00:00:00 UTC.As ZZ Coder shows, you set the timezone on the
DateFormat
object, to tell it in which timezone you want to display the date and time.太长了;博士
juDate 中没有时区
正如其他正确答案所述,java.util.Date 没有时区†。它代表UTC/GMT(无时区偏移)。非常令人困惑,因为它的 toString 方法在生成 String 表示形式时应用了 JVM 的默认时区。
避免 juDate
由于这个原因和许多其他原因,您应该避免使用内置的 java.util.Date & .日历& java.text.SimpleDateFormat。他们是出了名的麻烦。
而是使用与Java 8。
java.time
java.time 类可以通过三种方式表示时间线上的时刻:
Instant
)OffsetDateTime
带有ZoneOffset
) >)ZonedDateTime
和ZoneId
)Instant
在 java.time,基本构建块是
Instant
,UTC 时间线上的某个时刻。将Instant
对象用于大部分业务逻辑。OffsetDateTime
应用 offset-from-UTC 来调整到某个地区的< a href="https://en.wikipedia.org/wiki/Wall_clock_time" rel="noreferrer">挂钟时间。
应用
ZoneOffset
获取OffsetDateTime
< /a>.ZonedDateTime
更好的是应用时区,一个偏移量加上处理异常的规则,例如夏令时 (DST)。
应用
ZoneId
到Instant
以获取ZonedDateTime
。始终指定正确的时区名称。切勿使用既不唯一也不标准化的 3-4 个缩写,例如EST
或IST
。LocalDateTime
如果输入字符串缺少任何偏移量或区域指示符,则解析为
LocalDateTime
。如果您确定所需时区,请分配
ZoneId
以生成ZonedDateTime
。请参阅顶部 tl;dr 部分中的代码示例。格式化字符串
在这三个类中的任何一个上调用
toString
方法来生成表示标准 ISO 8601 格式。ZonedDateTime
类通过在括号中附加时区名称来扩展标准格式。对于其他格式,请使用
DateTimeFormatter
类。通常最好让该类使用用户预期的人类语言和文化规范生成本地化格式。或者您可以指定特定的格式。
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
java.util.Date
< /a>, <代码>日历,&SimpleDateFormat< /代码>
。
要了解更多信息,请参阅 Oracle 教程 。并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310。
Joda-Time 项目,现已在 维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换java.time对象。使用符合 JDBC 驱动程序 jeps/170" rel="noreferrer">JDBC 4.2 或更高版本。不需要字符串,不需要 java.sql.* 类。 Hibernate 5 和 Hibernate 5 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
Joda-Time
虽然 Joda-Time 仍在积极维护中,但其制造商已告诉我们迁移到 java .方便的时候尽快。我保留此部分完整作为参考,但我建议使用上面的
java.time
部分。在 Joda-Time 中,日期时间对象 (
DateTime
) 确实知道其指定的时区。这意味着与 UTC 以及该时区夏令时 (DST) 的规则和历史以及其他此类异常的偏差。调用
toString
方法生成 ISO 8601 格式的字符串。Joda-Time 还提供丰富的功能来生成各种其他字符串格式。
如果需要,您可以从 Joda-Time DateTime 转换为 java.util.Date。
在 StackOverflow 中搜索“joda date”可以找到更多示例,其中一些非常详细。
†实际上,java.util.Date 中嵌入了一个时区,用于某些内部函数(请参阅此答案的评论)。但是这个内部时区没有作为属性公开,并且无法设置。此内部时区不是
toString
方法生成日期时间值的字符串表示形式;相反,JVM 当前的默认时区是即时应用的。因此,作为简写,我们经常说“juDate 没有时区”。令人困惑?是的。这是避免这些令人厌倦的旧课程的另一个原因。tl;dr
No Time Zone in j.u.Date
As the other correct answers stated, a java.util.Date has no time zone†. It represents UTC/GMT (no time zone offset). Very confusing because its
toString
method applies the JVM's default time zone when generating a String representation.Avoid j.u.Date
For this and many other reasons, you should avoid using the built-in java.util.Date & .Calendar & java.text.SimpleDateFormat. They are notoriously troublesome.
Instead use the java.time package bundled with Java 8.
java.time
The java.time classes can represent a moment on the timeline in three ways:
Instant
)OffsetDateTime
withZoneOffset
)ZonedDateTime
withZoneId
)Instant
In java.time, the basic building block is
Instant
, a moment on the time line in UTC. UseInstant
objects for much of your business logic.OffsetDateTime
Apply an offset-from-UTC to adjust into some locality’s wall-clock time.
Apply a
ZoneOffset
to get anOffsetDateTime
.ZonedDateTime
Better is to apply a time zone, an offset plus the rules for handling anomalies such as Daylight Saving Time (DST).
Apply a
ZoneId
to anInstant
to get aZonedDateTime
. Always specify a proper time zone name. Never use 3-4 abbreviations such asEST
orIST
that are neither unique nor standardized.LocalDateTime
If the input string lacked any indicator of offset or zone, parse as a
LocalDateTime
.If you are certain of the intended time zone, assign a
ZoneId
to produce aZonedDateTime
. See code example above in tl;dr section at top.Formatted Strings
Call the
toString
method on any of these three classes to generate a String representing the date-time value in standard ISO 8601 format. TheZonedDateTime
class extends standard format by appending the name of the time zone in brackets.For other formats use the
DateTimeFormatter
class. Generally best to let that class generate localized formats using the user’s expected human language and cultural norms. Or you can specify a particular format.About java.time
The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as
java.util.Date
,Calendar
, &SimpleDateFormat
.To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.
The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.
You may exchange java.time objects directly with your database. Use a JDBC driver compliant with JDBC 4.2 or later. No need for strings, no need for
java.sql.*
classes. Hibernate 5 & JPA 2.2 support java.time.Where to obtain the java.time classes?
Joda-Time
While Joda-Time is still actively maintained, its makers have told us to migrate to java.time as soon as is convenient. I leave this section intact as a reference, but I suggest using the
java.time
section above instead.In Joda-Time, a date-time object (
DateTime
) truly does know its assigned time zone. That means an offset from UTC and the rules and history of that time zone’s Daylight Saving Time (DST) and other such anomalies.Call the
toString
method to generate a String in ISO 8601 format.Joda-Time also offers rich capabilities for generating all kinds of other String formats.
If required, you can convert from Joda-Time DateTime to a java.util.Date.
Search StackOverflow for "joda date" to find many more examples, some quite detailed.
†Actually there is a time zone embedded in a java.util.Date, used for some internal functions (see comments on this Answer). But this internal time zone is not exposed as a property, and cannot be set. This internal time zone is not the one used by the
toString
method in generating a string representation of the date-time value; instead the JVM’s current default time zone is applied on-the-fly. So, as shorthand, we often say “j.u.Date has no time zone”. Confusing? Yes. Yet another reason to avoid these tired old classes.您还可以在 JVM 级别
输出设置时区:
You could also set the timezone at the JVM level
output:
如果您必须仅使用标准 JDK 类,则可以使用以下内容:
归功于此 帖子。
If you must work with only standard JDK classes you can use this:
Credit goes to this post.
java.util.Calendar
是仅使用 JDK 类处理时区的常用方法。 Apache Commons 有一些可能有用的其他替代方案/实用程序。 编辑 Spong 的笔记提醒我,我听说过关于 Joda 的好消息-时间(虽然我自己没有用过)。java.util.Calendar
is the usual way to handle time zones using just JDK classes. Apache Commons has some further alternatives/utilities that may be helpful. Edit Spong's note reminded me that I've heard really good things about Joda-Time (though I haven't used it myself).将日期转换为字符串并使用 SimpleDateFormat 完成。
Convert the Date to String and do it with SimpleDateFormat.
这段代码对我正在开发的应用程序很有帮助:
This code was helpful in an app I'm working on:
在这里您可以获取诸如“2020-03-11T20:16:17”之类的日期并返回“11/Mar/2020 - 20:16”
Here you be able to get date like "2020-03-11T20:16:17" and return "11/Mar/2020 - 20:16"
如果有人需要这个,如果您需要将
XMLGregorianCalendar
时区从 UTC 转换为当前时区,那么您所需要做的就是将时区设置为0
,然后调用toGregorianCalendar()
- 它将保持相同的时区,但Date
知道如何将其转换为您的时区,因此您可以从那里获取数据。结果:
If anyone ever needs this, if you need to convert an
XMLGregorianCalendar
timezone to your current timezone from UTC, then all you need to do is set the timezone to0
, then calltoGregorianCalendar()
- it will stay the same timezone, but theDate
knows how to convert it to yours, so you can get the data from there.Result: