Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 - Fatal编程技术网

Java无法生成正确的时区信息

Java无法生成正确的时区信息,java,timezone,Java,Timezone,我在Windows机器上运行Java程序。我正试图得到一个时区及其相关信息的列表。以下是完整的程序: String[] allTimeZones = TimeZone.getAvailableIDs(); Date now = new Date(); for (int i = 0; i < allTimeZones.length; i++) { TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]);

我在Windows机器上运行Java程序。我正试图得到一个时区及其相关信息的列表。以下是完整的程序:

    String[] allTimeZones = TimeZone.getAvailableIDs();
    Date now = new Date();
    for (int i = 0; i < allTimeZones.length; i++) {
        TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]);
        System.out.format("%s;%s; %f \n", 
                          allTimeZones[i],
                          tz.getDisplayName(), 
                          (float) (tz.getOffset(now.getTime())/3600000.0));
    }
String[]allTimeZones=TimeZone.getAvailableIDs();
现在日期=新日期();
for(int i=0;i
其中一个生成的时区具有以下信息:

美国/纽约;东部标准时间-400万

这令人费解。此时此刻,纽约正处于东部夏时制。所以上面的信息是不正确的

有人知道我如何让Java生成

美国/纽约;东部标准时间-500万

或者类似的事情

美国/纽约;东部夏时制-400万

谢谢你的帮助

关于

使用,为
日光传递
true
。这将打印:

America/New_York;Eastern Daylight Time; -4.000000
但您必须确定当前时间是否为夏令时(或者它将始终返回“夏令时”,即使在秋季和冬季)。这应该可以做到:

String[] allTimeZones = TimeZone.getAvailableIDs();
Date now = new Date();
for (int i = 0; i < allTimeZones.length; i++) {
    TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]);
    System.out.format("%s;%s; %f \n", allTimeZones[i], 
            tz.getDisplayName(tz.inDaylightTime(now), TimeZone.LONG), 
            (float) (tz.getOffset(now.getTime())/3600000.0));
}
String[]allTimeZones=TimeZone.getAvailableIDs();
现在日期=新日期();
for(int i=0;i
tl;博士 然后 真的

……还有

ZoneId
.of( "America/New_York" )
.getRules()
.getOffset( 
    ZonedDateTime
    .of(
        LocalDate.of( 2013 , Month.APRIL , 5 ) ,
        LocalTime.of( 15 , 34 ) ,
        ZoneId.of( "America/New_York")
    )
    .toInstant()
)
ZoneId
.of( "America/New_York" )
.getRules()
.getOffset( 
    Instant.now()
)
-04:00

现在 假的

……还有

ZoneId
.of( "America/New_York" )
.getRules()
.getOffset( 
    ZonedDateTime
    .of(
        LocalDate.of( 2013 , Month.APRIL , 5 ) ,
        LocalTime.of( 15 , 34 ) ,
        ZoneId.of( "America/New_York")
    )
    .toInstant()
)
ZoneId
.of( "America/New_York" )
.getRules()
.getOffset( 
    Instant.now()
)
-05:00

看这个

java.time 现代方法使用多年前的java.time类取代了与最早版本的java捆绑在一起的糟糕的日期时间类

单区 使用
ZoneId
而不是
TimeZone

ZoneId z = ZoneId.of( "America/New_York" ) ;
获取该区域的规则,过去、现在和未来对该特定区域人民使用的偏移量的变化历史

ZoneRules rules = z.getRules();
捕捉当前时刻

Instant now = Instant.now();  // Capture the current moment as seen in UTC (an offset of zero hours-minutes-seconds).
我们必须指定请求当前偏移量和当前夏令时(DST)信息的时间

ZoneOffset offset = rules.getOffset( now );
boolean inDST = rules.isDaylightSavings( now );
转储到控制台

您请求的偏移量类似于
-4.000000
。但偏移量通常不是这样表示的。因此,这里我们使用时钟样式中偏移量的小时、分钟和秒的通用表示,例如
-05:00
。根据ISO 8601标准,负数在UTC之后,正数在UTC之前。请注意,相同的协议会起相反的作用,因此请始终了解工作中涉及的协议

System.out.println( "now = " + now );
System.out.println( "offset = " + offset );
System.out.println( "inDST = " + inDST );
跑步的时候

现在=2020-02-10T00:21:26.426569Z

偏移量=-05:00

inDST=false

让我们看看挂在那个地区墙上的钟的读数。我们使用
ZoneDateTime
来表示在时区中看到的一个时刻

ZonedDateTime zdt = now.atZone( z );
zdt=2020-02-09T19:21:26.426569-05:00[美国/纽约]

是偏移量,表示该区域的挂钟时间比UTC早五小时。所以我们的时间是19而不是0,日期是9而不是10。相同的时刻,不同的挂钟时间

循环所有区域 获取时区id字符串的

Set < String > zoneIds = ZoneId.getAvailableZoneIds();
捕获用于确定当前使用的偏移量的当前力矩

Instant now = Instant.now() ;  // Capture the current moment as seen in UTC.
循环区域id字符串,获取每个字符串的对象

System.out.println( "now = " + now );
System.out.println( "" );
System.out.println( "zoneId | localized | offset" );
for ( String zoneId : zoneIds )
{
    ZoneId z = ZoneId.of( zoneId );
    System.out.println( zoneId + " | " + z.getDisplayName( style , locale ) + " | " + z.getRules().getOffset( now ) );
}
这是输出的一部分。由于堆栈溢出中答案的32K限制而被截断

now=2020-02-10T00:09:43.073300Z
分区|局部|偏移
亚洲/亚丁|阿拉伯之乡|+03:00
美洲/Cuiaba | heure de l'Amazonie |-04:00
Etc/GMT+9|UTC−9:00 | -09:00
Etc/GMT+8 | UTC−8:00 | -08:00
非洲/内罗毕|东部非洲之乡|+03:00
美国/马里戈特|亚特兰蒂斯之家|-04:00
亚洲/阿克套|黑尔德阿克套|+05:00
太平洋/夸贾林|马绍尔群岛|+12:00
美洲/萨尔瓦多中心-06:00
亚洲/蓬蒂亚纳克| Heure de l'Indonésie occidentale |+07:00
非洲/开罗|欧洲之家|+02:00
太平洋/帕果帕果-萨摩亚之乡-11:00
非洲/姆巴巴纳|南部非洲|+02:00
亚洲/古晋|马来西亚之家|+08:00
太平洋/檀香山| Haured'Hawaï-Aléoutiennes |-10:00
太平洋/拉罗通加|霍雷德斯库克|-10:00
美国/危地马拉| heure du Centre |-06:00
澳大利亚/澳大利亚东部霍巴特郡+11:00
欧洲/伦敦| Heure britannique | Z
美国/伯利兹| heure du Centre |-06:00
美国/巴拿马| heure de l'Est |-05:00
亚洲/重庆|中国之家|+08:00
美洲/马那瓜| heure du Centre |-06:00
美国/印第安纳州/彼得堡|东部之乡|-05:00
亚洲/埃里温|赫尔阿姆尼|+04:00
欧洲/布鲁塞尔|欧洲中心大厦|+01:00
格林威治时间
欧洲/华沙|欧洲中心大厦|+01:00
美国/芝加哥| heure du Centre |-06:00
亚洲/喀什|中国|+06:00
智利/大陆| heure du Chili |-03:00
太平洋/亚普| Heure de Chuuk |+10:00
CET |欧洲中央大学|+01:00
Etc/GMT-1 | UTC+1:00 |+01:00
Etc/GMT-0 | heure moyenne de Greenwich | Z
欧洲/泽西岛| Heure britannique | Z
美国/特古西加尔巴|哈雷杜中心|-06:00
Etc/GMT-5 | UTC+5:00 |+05:00
欧洲/伊斯坦布尔|欧洲之家|+03:00
美洲/埃鲁内佩|休尔德拉克|-05:00
Etc/GMT-4 | UTC+4:00 |+04:00
美洲/米奎隆|圣皮埃尔和米奎隆之家|-03:00
Etc/GMT-3 | UTC+3:00 |+03:00
欧洲/卢森堡|欧洲中心大厦|+01:00
Etc/GMT-2 | UTC+2:00 |+02:00
Etc/GMT-9 | UTC+9:00 |+09:00
美国/阿根廷/卡塔马卡|阿根廷之乡|-03:00
Etc/GMT-8 | UTC+8:00 |+08:00
Etc/GMT-7 | UTC+7:00 |+07
System.out.println( "now = " + now );
System.out.println( "" );
System.out.println( "zoneId | localized | offset" );
for ( String zoneId : zoneIds )
{
    ZoneId z = ZoneId.of( zoneId );
    System.out.println( zoneId + " | " + z.getDisplayName( style , locale ) + " | " + z.getRules().getOffset( now ) );
}