首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >偏移值将处理Java中的夏令时区吗?

偏移值将处理Java中的夏令时区吗?
EN

Stack Overflow用户
提问于 2019-09-18 20:09:05
回答 3查看 441关注 0票数 0
代码语言:javascript
复制
TimeZone.setDefault(TimeZone.getTimeZone("GMT-7:00"));

这会处理夏令时时区吗?

只需要像这样的地区名称:'America/Lost_Angeles'?

EN

回答 3

Stack Overflow用户

发布于 2019-09-18 20:40:28

如你所知,洛杉矶在一年中的标准时间是偏移量−08:00,在夏季时间(DST)的偏移量是−07:00 (就像现在)。其他时区使用偏移量-07:00一年中的一部分或全部。美国/凤凰城全年使用-07:00。美国/丹佛在标准时间使用-07:00,在夏季使用-06:00。

Java不是思想阅读器,所以没有机会猜到-07:00您可能指的是这些时区中的一个,或者也使用-07:00的许多其他时区中的一个。所以当你要求-07:00的时候,你得到的是-07:00。

会处理夏令时时区吗?

不是的。

只需要像这样的地区名称:'America/Los(t)_Angeles'?

是。

我建议您不要使用TimeZone类。它的设计很差,而且很久以前就过时了。取而代之的是使用java.time的ZoneId,它是现代的Java date and time API。或者,如果您已经在使用Joda-Time,那么它的DateTimeZone也是一个选择,但是Joda-Time项目处于维护模式,不推荐用于新代码。

特别是不要使用TimeZone.setDefault()。这将影响程序的每个部分以及在同一JVM中运行的所有其他程序。最佳解决方案是在所有日期-时间操作中显式设置时区,这样您就可以独立于任何默认时区设置。如果由于某些原因您不能这样做(可能现在还不能对代码库进行更改),请在启动程序时从命令行设置默认时区。例如:

代码语言:javascript
复制
java -Duser.timezone=America/Los_Angeles YourJavaMainClass

链接: List of tz database time zones包括36个时区,使用偏移量-07:00部分或全年。

票数 4
EN

Stack Overflow用户

发布于 2019-09-19 00:37:17

Answer by Ole V.V.是正确的。

此外,在这里要小心。请注意,设置默认时区会立即影响在该JVM中运行的所有应用程序的所有线程中的所有代码。只有在万不得已的情况下才使用TimeZone.setDefault

不依赖于默认的时区.java,这使得您的应用程序的结果由系统管理员和其他程序员决定。运行时的结果可能会有所不同。

相反,始终指定所需/预期的时区。将ZoneId对象作为可选参数传递给各种日期时间方法。如果省略,Java将隐式回退到使用JVM的当前缺省时区。最好显式指定时区。在我看来,使时区参数成为可选参数是优秀的java.time类中极少数的设计缺陷之一,因为太多的程序员没有意识到时区所起的关键作用。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

“格林尼治标准时间-7:00”

如果必须使用offset-from-UTC,请使用智能对象,而不是哑字符串。合适的类是ZoneOffset

代码语言:javascript
复制
ZoneOffset offset = ZoneOffset.of( -7 ) ; 

但是总是优先使用时区,而不是仅仅使用偏移量。偏移量是指UTC基线之前或之后的小时-分钟-秒数。

相比之下,时区的意义要大得多。时区是一个地区的人们所使用的偏移量的过去、现在和未来变化的历史。

任何区域的偏移量都会令人惊讶地频繁变化。首先,许多地方的政客已经被愚蠢的夏令时(DST)迷住了。几十年来,这些政客一直忙于采用DST,改变DST的开始和结束日期,离开DST,重新加入DST。现在,现在的时尚是决定永久留在DST上。旋转木马转了一圈又一圈。但政治人物也出于其他原因改变时差,比如为了像印度一样统一他们的国家,或者通过匹配或不同邻国的时区来发表声明,就像朝鲜最近所做的那样。

因此,避免依赖于固定的偏移量。在任何已知的地方确定地使用时区。

使位于以下位置的“tzdata”时区数据库拷贝保持最新:

  • 您的JVM。
  • 您的操作系统,如BSD/macOS/Linux/Windows/Solaris/AIX.
  • Your数据库引擎,如Postgres.
  • Your软件库,执行日期时间函数。
票数 3
EN

Stack Overflow用户

发布于 2021-07-18 19:34:15

对于日常节光,timezone时间将在较温暖的月份从11月提前到3月一小时。您需要检查timezone是否适用于夏令时,以及给定的日期是否在这些持续时间之间。

Java为这两者都提供了方法

代码语言:javascript
复制
TimeZone tz = TimeZone.getTimeZone("GMT5:00");
if(tz.useDaylightTime() && tz.inDaylightTime(date1)) {
                    dst =TimeZone.getTimeZone(userTzStr).getDSTSavings();
}

该值将以毫秒为单位,相当于一个小时,并且可以在以给定格式返回日期之前添加到小时中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57992458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档