Java中的时区

时间:2013-02-05 09:19:05

标签: java javascript

这可能是一个非常基本的问题,但我找不到任何令人满意的答案。希望我的疑惑在stackoverflow上得到明确。

问答1. 假设我有时间在不同的时区,我想将其转换为不同的时区,在Java中使用它的方式是什么?

问2. 有没有办法使用JavaScript获取时区?

问题3. 时区只是特定区域中时间的表示,但实际上每个区域都在同一时间,只是表示方式可能因地理条件而异。 - < em>这种理解是正确的吗??

可能重复link

3 个答案:

答案 0 :(得分:2)

  

假设我有时间在不同的时区,并且我想将其转换为不同的时区,在Java中使用它的方式是什么?

创建格式化程序并在其中设置时区。

在内部,java.util.Date只存储自UTC时区中Epoch以来的毫秒数。 如果您在没有时区的情况下使用Date.toString()new SimpleDateFormat(),则会使用您的VM的默认时区。

所以从某种意义上说,Java总是转换为你当前/默认的时区(除非你恰好是UTC)。

  

有没有办法使用Java Script获取时区?

这取决于。您可以使用getTimezoneOffset(),但这只会提供偏移量。没有API来获取客户端的操作系统时区ID(如UTCEurope/Berlin等)。

  

时区只是时间的代表......

不是真的。见上文。

答案 1 :(得分:1)

问1.假设我有时间在不同的时区,并且我想将其转换为不同的时区,在Java中使用它的方式是什么?

现代方法是使用java.time类。

首先,在UTC中完成大部分工作。仅在必要时应用时区,例如向用户演示。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = Instant.now();

如果您只有一个来自UTC的偏移而不是一个时区,请应用ZoneOffset来获取OffsetDateTime

ZoneOffset offset = ZoneOffset.ofHours( -4 );
OffsetDateTime odt = instant.atOffset( offset );

时区是UTC的偏移量(特定小时数,分钟数和秒数)加上用于处理夏令时(DST)等异常的一组规则。用ZoneId对象表示时区。指定proper time zone name。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

应用ZoneId获取ZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

您可以将其他时区应用于InstantZonedDateTime

ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );

问2.有没有办法使用JavaScript获取时区?

已经在Stack Overflow上无数次地处理了从Web浏览器确定时区的问题。

所以我会跳过这个,除了说结果:不,不是真的以可靠的方式;当准确了解时区非常重要时,您必须自己询问用户。

<3>问题3.时区只是特定区域中时间的表示,但实际上每个区域都在同一时间,只是表示方式可能因地理条件而异。 - 这种理解是正确的吗?

不,时区不是日期时刻。

时区为日期时间添加有意义的上下文,其方式与货币名称为金额添加有意义的上下文的方式相同。没有时区的日期时间只是对可能时刻的粗略概念,而不是时间轴上的精确点。奥克兰的中午比加尔各答的早中午早于巴黎的中午,比蒙特利尔的蒙特利尔中午早。

您可以将其视为伪数学陈述:

  

时区=(偏离UTC +规则异常组)

假想时区的一个例子:

  • 偏移可能是“比UTC早一个小时”,加上
  • 这套规则:“在这一天,我们将参与DST,在此日期我们将脱离DST,在第二次世界大战期间的这一天我们确实提前一小时,在第二次世界大战后的这个日期我们转移了一个小时,在这一天,我们的政府将时钟向前移动半小时,使我们与我们的主要竞争对手邻国区别开来......“。

您可以将时区应用于时间轴上的某个点。就像通过镜头看艺术一样,它会改变你的感知,但不会改变神器本身。通过时区镜头观察时间轴上的某个点会将时间和可能的日期扭曲为特定社区的wall-clock time

另一种伪数学方程式,用于考虑时区的类表示和时间轴上的时刻:

  

ZonedDateTime = Instant + ZoneId

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

使用符合JDBC driver或更高版本的JDBC 4.2,您可以直接与数据库交换 java.time 对象。不需要字符串也不需要java.sql。* classes。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

我可以回答你的第二个问题并纠正Aaron Digulla非常完整的回复

  

有没有办法使用Java Script获取时区?

尝试使用此库,它将返回一个具有特定限制的TimeZone ID(在开发人员的页面中介绍):

https://bitbucket.org/pellepim/jstimezonedetect