Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 考虑到夏令时,如何获得实时时区偏移?_Java_Timezone_Timezone Offset - Fatal编程技术网

Java 考虑到夏令时,如何获得实时时区偏移?

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/

我现在在+3时区。
现在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及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用它们,并切换到2014年3月作为Java SE 8标准库的一部分发布的*

使用现代日期时间API
java.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())