java:timezone getTimeZone("GMT-0700")'timezone useDaylight不正确

bev*_*swu 2 java timezone dst timezone-offset

我想获得洛杉矶的时区信息,现在10/10/2017是夏令时,但当我在洛杉矶以两种方式获得时区时,我得到了不同的结果.

public class TimeZoneDemo2 {
  public static void main(String[] args) {
    TimeZone timeZoneLosAngeles = 
    TimeZone.getTimeZone("America/Los_Angeles");
    System.out.println(timeZoneLosAngeles);

    TimeZone timeZoneGmtMinus07 = TimeZone.getTimeZone("GMT-07:00");
    System.out.println(timeZoneGmtMinus07);
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

sun.util.calendar.ZoneInfo [ID = "美国/洛杉矶",偏移= -28800000,dstSavings = 3600000,useDaylight =真,过渡= 185,lastRule = java.util.SimpleTimeZone中[ID =美洲/洛杉矶,偏移= - 28800000,dstSavings = 3600000,useDaylight =真,startYear = 0,STARTMODE = 3,startMonth = 2,朝九特派= 8,startDayOfWeek = 1,开始时间= 7200000,startTimeMode = 0,endMode = 3,endMonth = 10,endday指定= 1,一个endDayOfWeek = 1,结束时间= 7200000,endTimeMode = 0]]

sun.util.calendar.ZoneInfo [ID = "GMT-07:00",偏移= -25200000,dstSavings = 0,useDaylight =假,过渡= 0,lastRule =空]

我的问题是:"America/Los_Angeles"获得的有关夏令时时区信息的信息.为什么不在"GMT -0700"获得的时区信息中包含夏令时信息(useDaylight = false)?

Jon*_*eet 9

我想获取洛杉矶的时区信息,现在10/10/2017是夏令时

所以你应该要求"America/Los_Angeles"区域.这就是它的用途.

"GMT-07:00"区域是固定偏移区域 - 仅当您想要表示"一个比UTC晚7个小时的时区"时才适用.这并不适用于洛杉矶.

还有很多其他时区有时在UTC-7 - 你为什么期望GMT-07:00意味着"在洛杉矶观察的时区"?

换句话说,Java正在做正确的事情 - 这是你对"GMT-07:00"区域意味着不正确的期望.

  • 此外,洛杉矶的部分时间为UTC-8; 如果你希望Java在你使用GMT-7时猜测你的意思是Olsen id,它怎么知道你不是指丹佛?(或者在一年中的部分时间使用-7的任何其他地方). (2认同)