当前位置: 首页 > 知识库问答 >
问题:

java:timezone getTimeZone(“GMT-0700”)“时区useDaylight不正确

邢灿
2023-03-14

我想得到洛杉矶的时区信息,现在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);
  }
}

结果是:

太阳util。日历ZoneInfo[id=“America/Los_Angeles”,offset=-2880000,dstSaves=3600000,useDaylight=true,transitions=185,lastRule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-2880000,dstSaves=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDayOfWeek=8,startDayOfWeek=1,StartDayMemode=7200000,TimeMode=3,endMonth=10]

太阳util。日历ZoneInfo[id=“GMT-07:00”,偏移量=-25200000,dststavings=0,useDaylight=false,transitions=0,lastRule=null]

我的问题是:“美国/Los_Angeles”获得的时区信息中有关夏令时的信息。为什么不在“格林威治标准时间-0700”获得的时区信息中包含夏令时信息(useDaylight=false)?

共有2个答案

羊舌自强
2023-03-14

Jon Skeet的回答是正确的,应该被接受。您无法根据与UTC的偏移量可靠地确定时区,因为许多区域可能会同时共享一个偏移量。此外,分区的偏移可能会随时间而变化。

下面是一些代码示例,它们使用比问题中看到的更现代的类来解决这个问题。

您使用的是麻烦的旧日期时间类,它们现在是遗留的,被java所取代。时间课。

正如其他人所说,如果您知道预期的时区,请始终优先使用该时区,而不是仅仅从UTC偏移。偏移量只是比UTC提前或落后数小时、分钟和秒。时区是一个地区的人们使用的偏移量的变化历史。时区知道偏移量变化的过去、现在和(暂时)未来。

ZoneIdZoneOffset类替换TimeZone

大陆/地区的格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Los_Angeles" ) ;  // Or "Africa/Tunis", "Pacific/Auckland", etc.

通过该区域的镜头获取当前时刻。

ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Fetch current moment for that zone.

提取同一时刻,但调整为UTC。

Instant instant = zdt.toInstant() ;  // Extract the same moment but in UTC.

将这一时刻调整到另一个区域。

ZonedDateTime zdtKolkata = instant.atZone( ZoneId.of( "Asia/Kolkata" ) ) ;  // Determine same moment, same point on timeline, but in another time zone.

所有这三个对象都代表时间线上相同的同时点,但以不同的挂钟时间观看。

看看那个地区的人们当时使用的偏移量。

ZoneOffset offset = z.getRules().getOffset( instant ) ;  // Get the offset in place at that moment for that time zone.

您会发现,在2018年的部分时间里,America/Los_Angeles的偏移量将是-07:00(比UTC晚几个小时)。在一年的另一部分,偏移量将是-08:00(比UTC晚八个小时)。偏移量的这种变化是由于政治家决定遵守夏令时(DST)。

java.timehtml" target="_blank">框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.DateCalendar

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310。

从哪里获得java.time课程?

  • JavaSE8、JavaSE9及更高版本
  • java的大部分内容。时间功能被重新移植到Java 6
  • 更高版本的Android捆绑包实现了java。时间课
  • 对于早期的Android,ThreeTenABP项目采用了ThreeTen Backport(如上所述)。了解如何使用ThreeTenABP

Three10-Extra项目通过附加类扩展java.time。该项目是未来可能添加到java.time.的试验场。您可以在此处找到一些有用的类,例如IntervalYearWeekYearQuarter等。

单品
2023-03-14

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

所以你应该申请“美国/洛杉矶”区域。这就是它的目的。

“GMT-07:00”区域是一个固定的偏移区域——仅当您想要表示“一个永远落后于UTC七小时的时区”时才适用。这不适用于洛杉矶。

还有很多其他时区有时是UTC-7——为什么你认为GMT-07:00的意思是“在洛杉矶观察到的时区”?

换句话说,Java正在做正确的事情——你对“GMT-07:00”区域的预期是错误的。

 类似资料:
  • 结果是: sun.util.calendar.zoneinfo[id=“America/Los_Angeles”,offset=-28800000,dstsavings=3600000,usedaylight=true,transitions=185,lastrule=java.util.SimpleTimeZone[id=America/Los_Angeles,offset=-28800000,

  • 问题内容: 这是我需要处理的日期格式 但是我不了解最后两个部分。是固定的吗?应该是这样吗? 问题答案: 不,它不是固定的。这是一个时区。您可以将其与日期格式匹配。 更准确地说,采用SimpleDateFormat格式: 匹配零件。 是固定的。用一些引号将其转义。 z匹配部分。(PDT =太平洋夏令时间)。 PDT周围的括号是固定的。用括号将其转义。 您可以使用以下格式解析日期: 另一个要点 :包含

  • 但我不明白最后两个部分是什么。是否已修复?应该是这样的吗?

  • 问题内容: 苹果使用Etc / GMT时区的原因是什么,当苹果从App Store返回收据以进行自动续订时,该理由是什么。 Etc / GMT时区到底是什么时间?Java SDK是否了解该时区?还是我必须使用其他第三方库(如Joda- Time) ? 问题答案: Etc / GMT 与UTC或GMT 并不 完全相同。仅当偏移量为0时,它们表示时间上的同一时刻。在所有其他情况下,它们是完全不同的。

  • 问题内容: 无论计算机上设置的时区如何,我都需要对GMT / UTC进行任何与时间相关的操作。在代码中有任何方便的方法吗? 为了明确起见,我将所有操作都使用数据库服务器时间,但是它是根据本地时区格式化的。 谢谢! 问题答案: OP回答了这个问题,以更改正在运行的JVM的单个实例的默认时区,并设置系统属性: 如果从数据库检索Date / Time / Timestamp对象时需要设置特定的时区,请使

  • 与许多Web应用程序一样,我正在开发的应用程序需要为我们亲爱的最终用户转换时区。然而,当我在PHP 5.3中使用Carbon/DateTime时,我发现这很奇怪: 我将的时区设置为GMT 5,但是当我格式化时,它变成,而不是预期的。 同样,如果我将其设置为负数,即,则格式显示而不是预期的。 有人能开导吗? 我能够在PHP5.3.3、5.3.13、5.3.28中复制这个问题。认为这是一个PHP特定的