获取特定时区一年夏时制的开始和结束详细信息的JavaAPI

获取特定时区一年夏时制的开始和结束详细信息的JavaAPI,java,datetime,calendar,timezone,jodatime,Java,Datetime,Calendar,Timezone,Jodatime,所以我使用下面的方法来获取可用时区的列表 我想知道是否有一种方法可以让我在特定的时区(如“美国/芝加哥”)找到一年夏令时的开始和结束日期时间细节。 比如什么时候开始和结束。 浏览了java中可用的各种类,包括ZoneId、ZoneDateTime、ZoneOffset、TimeZone,但找不到获取这些详细信息的方法 我尝试了下面的代码,并给出了下面提到的输出 ZoneId zoneId= ZoneId.of("America/Sao_Paulo"); ZoneRules zon

所以我使用下面的方法来获取可用时区的列表

我想知道是否有一种方法可以让我在特定的时区(如“美国/芝加哥”)找到一年夏令时的开始和结束日期时间细节。 比如什么时候开始和结束。 浏览了java中可用的各种类,包括ZoneId、ZoneDateTime、ZoneOffset、TimeZone,但找不到获取这些详细信息的方法

我尝试了下面的代码,并给出了下面提到的输出

    ZoneId zoneId= ZoneId.of("America/Sao_Paulo");
    ZoneRules zoneRules = zoneId.getRules();
    System.out.println("previous Transition of DST ==>  " + zoneRules.previousTransition(Instant.now()));
    System.out.println("next Transition of DST ==>  " + zoneRules.nextTransition(Instant.now()));
输出:

previous Transition of DST ==>  Transition[Overlap at 2019-02-17T00:00-02:00 to -03:00]
next Transition of DST ==>  Transition[Gap at 2019-11-03T00:00-03:00 to -02:00]

但是我需要知道某一年的开始时间和结束时间。

对于某一年,你可以在指定某一时刻时给出一年。对于任何给定的时刻,你都可以问或问

下面是时区的示例代码

ZoneId zoneSofia = ZoneId.of( "Europe/Sofia" );
ZoneRules zoneRules = zoneSofia.getRules();

// Pick a moment, arbitrarily.
ZonedDateTime zdt = ZonedDateTime.of( 2019 , 10 , 15 , 10 , 0 , 0 , 0 , zoneSofia );
// Is DST in effect at that moment?
boolean isDst = zoneRules.isDaylightSavings( zdt.toInstant() );

// When are the closest offset transitions, previous (in the past), and next (in the future).
ZoneOffsetTransition previousTransition = zoneRules.previousTransition( zdt.toInstant() );
ZoneOffsetTransition nextTransition = zoneRules.nextTransition( zdt.toInstant() );

// When is the next transition happening in UTC? In Sofia time?
Instant nextTransitionInstant = nextTransition.getInstant();  // An `Instant`` is always in UTC, by definition.
ZonedDateTime nextTransactionZdt = nextTransitionInstant.atZone( zoneSofia ); // Same moment, same point on the timeline, different wall-clock time.
boolean isDstAfterTransition = zoneRules.isDaylightSavings( nextTransactionZdt.toInstant() );
转储到控制台

System.out.println( "zone = " + zoneSofia );
System.out.println( "zdt: " + zdt );
System.out.println( "isDst: " + isDst );
System.out.println( "previousTransition = " + previousTransition );
System.out.println( "nextTransition = " + nextTransition );
System.out.println( "nextTransitionInstant = " + nextTransitionInstant );
System.out.println( "nextTransactionZdt = " + nextTransactionZdt );
System.out.println( "isDstAfterTransition = " + isDstAfterTransition );
区域=欧洲/索非亚

zdt:2019-10-15T10:00+03:00[欧洲/索非亚]

isDst:没错

上一次过渡=过渡[2019-03-31T03:00+02:00至+03:00的间隙]

下一次过渡=过渡[在2019-10-27T04:00+03:00至+02:00重叠]

nextTransitionInstant=2019-10-27T01:00:00Z

nextTransactionZdt=2019-10-27T03:00+02:00[欧洲/索非亚]

isDstAfterTransition=false

我们可以看到,欧洲/索非亚的下一次转型发生在凌晨4点,比UTC提前3小时:

下一次过渡=过渡[在2019-10-27T04:00+03:00至+02:00重叠] …但由于我们正在进行“后退”,我们将时钟指针调回凌晨3点,比UTC早2小时:

nextTransactionZdt=2019-10-27T03:00+02:00[欧洲/索非亚] 我们可以通过isDstAfterTransition看到,在那个时刻,我们不再处于DST中

请注意,在27日这天,索非亚地区的人们两次经历了凌晨3点到4点的时间。凌晨3-4点的时间比UTC早3小时。第二个凌晨3-4点是UTC前2小时


这意味着27日的时间是25小时,而不是24小时

我想你可以用和ZoneId zone=ZoneId.ofAmerica/Chicago;我认为Java中的ZoneId类没有任何方法来提供特定时区的日光节约时间DST的开始和结束细节。您的代码显示的是America/SaoèPaulo,而不是“America/Chicago”@GeorgeWeekson在测试某些代码时使用了另一个时区示例。您的代码示例格式不正确。我想我已经把它修好了,但我要再次检查我的更改。这个网站使用降价。代码行应缩进四个空格。@BasilBourque感谢您的回复。我提出的一个小问题是欧洲地区,我相信DST从10月的最后一个太阳开始,到3月的最后一个太阳结束。但如果我们检查欧洲/索非亚2019年10月15日的当前日期,如果该日期是否在DST,则为真。同样的方法,如果我检查10月27日之后的任何日期,它会给出false。所以我在这里遗漏了一些基本知识。你能帮我弄清楚这个概念吗。ZoneOffsetTransition NextNext Transition=zoneRules.nextTransitionnextTransition.getInstant,System.out.printlnext transition在:+nextNextTransition.getInstant.atZonezone@BasilBourque之后的下一个转换类似于上面代码给出的下一个转换在2020-03-29T04:00+03:00[欧洲/索非亚],之后如果我检查3月30日,它给出的DST为真。@GeorgeWeekson感谢所有的回复和回答,并为错误的标记表示歉意。将通过文档查找详细信息。@GeorgeWeekson在对您的代码进行了一些实验以澄清我的理解后,我认为我对您的代码的重新排列可能会帮助其他人,所以我用我的代码替换了您的安排。我添加了一些解释性文本。如果你觉得我劫持了你的答案,请回复更改,我会发布我自己的答案。