Java 考虑到夏令时,如何获得实时时区偏移?
我现在在+3时区。Java 考虑到夏令时,如何获得实时时区偏移?,java,timezone,timezone-offset,Java,Timezone,Timezone Offset,我现在在+3时区。 现在UTC时间是16:30,在我这里是19:30 我发现了一个关于时区America/Los_Angeles 理论上是-8(rawOffset),我得到了意想不到的时间。 我希望如果在我的位置20:00,那么在这个时间段,ZOE时间应该少11小时(8+3),但在现实生活中,由于夏令时,它比我的位置少10小时 那么,如果我的代码中有America/Los_AngeleszoneId,我怎么能得到-7偏移量呢 TimeZone.getTimeZone("America/
现在UTC时间是16:30,在我这里是19:30 我发现了一个关于时区
America/Los_Angeles
理论上是-8(rawOffset),我得到了意想不到的时间。
我希望如果在我的位置20:00,那么在这个时间段,ZOE时间应该少11小时(8+3),但在现实生活中,由于夏令时,它比我的位置少10小时
那么,如果我的代码中有America/Los_Angeles
zoneId,我怎么能得到-7偏移量呢
TimeZone.getTimeZone("America/Los_Angeles").getRawOffset()/(3600*1000)
返回-8,但现在它与UTC相差7小时
如果您需要知道针对DST正确调整的时区偏移量,请不要使用,因为这是没有DST的特定偏移量。正如文件所说: 返回要添加到UTC以获取此时区的标准时间的时间量(毫秒)。由于该值不受夏令时的影响,因此称为原始偏移量 要知道DST是否有效,系统需要知道日期,而不仅仅是时间。如果您知道完整的日期/时间,那么您可以通过调用(例如)来获取偏移量 要立即获得有效的时区偏移,请调用:
int offset=TimeZone.getTimeZone(“美国/洛杉矶”)
.getOffset(System.currentTimeMillis());
整数分钟=偏移量/60000;
对于Java 8时间API,等效代码为:
ZoneOffset offset=ZoneId.of(“美国/洛杉矶”)
.getRules().getOffset(Instant.now());
int minutes=offset.getTotalSeconds()/60;
java.time
答案是正确的。这个答案提供了使用现代日期时间API的解决方案
java.util
Date-Time API及其格式化APISimpleDataFormat
已经过时,并且容易出错。建议完全停止使用它们,并切换到2014年3月作为Java SE 8标准库的一部分发布的*
使用现代日期时间APIjava.time的解决方案:
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneOffset offset = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")).getOffset();
System.out.println(offset);
}
}
-07:00
输出:
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneOffset offset = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")).getOffset();
System.out.println(offset);
}
}
-07:00
从了解有关现代日期时间API的更多信息
*无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。
@Eugene补充了一些细节。对不起,我还是不明白。单独阅读你的第一句话,没有任何意义为了知道DST是否有效,我们需要知道当时的日期。如果没有日期部分,系统无法确定DST是否处于活动状态。简言之,如果没有日期,您所要求的就无法完成。@Andreas让我们假设我们有日期如果您想知道DST现在是否有效,请使用
getOffset(System.currentTimeMillis())
。无需创建Date
对象。实际上,我的答案是:ZoneId.of(“America/Los_Angeles”).getRules().getOffset(Instant.now())