Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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时区名称';夏季&x27;应该是';日光';_Java_Datetime_Timezone - Fatal编程技术网

java时区名称';夏季&x27;应该是';日光';

java时区名称';夏季&x27;应该是';日光';,java,datetime,timezone,Java,Datetime,Timezone,在澳大利亚,新南威尔士州和昆士兰州位于同一经度。然而在夏天,一个遵守夏令时,另一个不遵守 因此,一年中有一半的时间他们相隔1小时 昆士兰州全年和新南威尔士州冬季在时区(AEST)内,GMT+10 新南威尔士州夏季 时区被称为(AEDT)和 格林尼治时间是11点 然而,根据爪哇AEST=EST(东部标准时间)和AEDT=EST(东部夏季时间) 因此,如果不打印完整时区名称,使用SimpleDataFormat无法区分它们: // printing the same date with diff

在澳大利亚,新南威尔士州和昆士兰州位于同一经度。然而在夏天,一个遵守夏令时,另一个不遵守

因此,一年中有一半的时间他们相隔1小时

  • 昆士兰州全年和新南威尔士州冬季在时区(AEST)内,GMT+10
  • 新南威尔士州夏季 时区被称为(AEDT)和 格林尼治时间是11点
然而,根据爪哇AEST=EST(东部标准时间)和AEDT=EST(东部夏季时间)

因此,如果不打印完整时区名称,使用SimpleDataFormat无法区分它们:

// printing the same date with different timezones

// using new SimpleDateFormat("dd/MM/yyyy HH:mm z")
26/12/2014 06:00 EST
26/12/2014 07:00 EST
// cannot tell the difference ^

// using new SimpleDateFormat("dd/MM/yyyy HH:mm z X zzzz")
26/12/2014 06:00 EST +10 Eastern Standard Time (Queensland)
26/12/2014 07:00 EST +11 Eastern Summer Time (New South Wales)

这是java中的一个bug吗?SimpleDataFormat或时区可以修补吗?

公共静态时区getTimeZone(字符串ID)
的Javadoc中,我们读到

ID—时区的ID,可以是缩写,如“PST”,全名,如“America/Los_Angeles”,也可以是自定义ID,如“GMT-8:00”请注意,缩写的支持仅用于JDK 1.1.x兼容性,应使用全名。

我们可以使用
TimeZone.getAvailableIDs()

如果我们对时区使用全名,我们会发现夏令时是正确的

    Date now = new Date();

    TimeZone timeZoneQLD = TimeZone.getTimeZone("Australia/Queensland");
    TimeZone timeZoneNSW = TimeZone.getTimeZone("Australia/NSW");

    DateFormat formatQLD = new SimpleDateFormat("dd/MM/yyyy HH:mm Z");
    DateFormat formatNSW  = new SimpleDateFormat("dd/MM/yyyy HH:mm Z");

    formatQLD.setTimeZone(timeZoneQLD);
    formatNSW.setTimeZone(timeZoneNSW);

    System.out.println("Queensland");
    System.out.println(formatQLD.format(now));
    System.out.println("DST saving " + timeZoneQLD.useDaylightTime());
    System.out.println();
    System.out.println("New South Wales");
    System.out.println(formatNSW.format(now));
    System.out.println("DST saving " + timeZoneNSW.useDaylightTime());
输出:

Queensland
11/03/2015 03:06 +1000
DST saving false

New South Wales
11/03/2015 04:06 +1100
DST saving true

关键是时区缩写不明确。EST=东部夏季时间和东部标准时间。这有一个java错误和解决方案——它只是没有生成最新版本。@pstanton这就是为什么文档说只能使用全名。
Queensland
11/03/2015 03:06 +1000
DST saving false

New South Wales
11/03/2015 04:06 +1100
DST saving true