TimeZone.setDefault(TimeZone.getTimeZone("GMT-7:00"));这会处理夏令时时区吗?
或
只需要像这样的地区名称:'America/Lost_Angeles'?
发布于 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中运行的所有其他程序。最佳解决方案是在所有日期-时间操作中显式设置时区,这样您就可以独立于任何默认时区设置。如果由于某些原因您不能这样做(可能现在还不能对代码库进行更改),请在启动程序时从命令行设置默认时区。例如:
java -Duser.timezone=America/Los_Angeles YourJavaMainClass链接: List of tz database time zones包括36个时区,使用偏移量-07:00部分或全年。
发布于 2019-09-19 00:37:17
Answer by Ole V.V.是正确的。
此外,在这里要小心。请注意,设置默认时区会立即影响在该JVM中运行的所有应用程序的所有线程中的所有代码。只有在万不得已的情况下才使用TimeZone.setDefault。
不依赖于默认的时区.java,这使得您的应用程序的结果由系统管理员和其他程序员决定。运行时的结果可能会有所不同。
相反,始终指定所需/预期的时区。将ZoneId对象作为可选参数传递给各种日期时间方法。如果省略,Java将隐式回退到使用JVM的当前缺省时区。最好显式指定时区。在我看来,使时区参数成为可选参数是优秀的java.time类中极少数的设计缺陷之一,因为太多的程序员没有意识到时区所起的关键作用。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;“格林尼治标准时间-7:00”
如果必须使用offset-from-UTC,请使用智能对象,而不是哑字符串。合适的类是ZoneOffset。
ZoneOffset offset = ZoneOffset.of( -7 ) ; 但是总是优先使用时区,而不是仅仅使用偏移量。偏移量是指UTC基线之前或之后的小时-分钟-秒数。
相比之下,时区的意义要大得多。时区是一个地区的人们所使用的偏移量的过去、现在和未来变化的历史。
任何区域的偏移量都会令人惊讶地频繁变化。首先,许多地方的政客已经被愚蠢的夏令时(DST)迷住了。几十年来,这些政客一直忙于采用DST,改变DST的开始和结束日期,离开DST,重新加入DST。现在,现在的时尚是决定永久留在DST上。旋转木马转了一圈又一圈。但政治人物也出于其他原因改变时差,比如为了像印度一样统一他们的国家,或者通过匹配或不同邻国的时区来发表声明,就像朝鲜最近所做的那样。
因此,避免依赖于固定的偏移量。在任何已知的地方确定地使用时区。
和使位于以下位置的“tzdata”时区数据库拷贝保持最新:
发布于 2021-07-18 19:34:15
对于日常节光,timezone时间将在较温暖的月份从11月提前到3月一小时。您需要检查timezone是否适用于夏令时,以及给定的日期是否在这些持续时间之间。
Java为这两者都提供了方法
TimeZone tz = TimeZone.getTimeZone("GMT5:00");
if(tz.useDaylightTime() && tz.inDaylightTime(date1)) {
dst =TimeZone.getTimeZone(userTzStr).getDSTSavings();
}该值将以毫秒为单位,相当于一个小时,并且可以在以给定格式返回日期之前添加到小时中。
https://stackoverflow.com/questions/57992458
复制相似问题