How to show the difference in time after the daylight saving started in Java?

别来无恙 提交于 2020-11-24 20:13:32

问题


I wanted to check the difference in time before and after the daylight saving time started. I am using a JVM where timezone has some issue with DST WRT Brazilian time. I could see the output where it says that 21st October falls under DST, which is wrong as the daylight saving started on 4th of November. I would like to see the timing difference which is 1 Hour in between 20th of October and 21st of October, which I could see in my application because of JRE Timezone issue. Is there any way I can achieve this by a program. Here below the code I have used to see if the date is under DST or not.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class Timezone
{
    public static void main(String[] args) throws ParseException {
        TimeZone TIMEZONE = TimeZone.getTimeZone("Brazil/East");

        System.out.println("timeZone : " + TIMEZONE);
        Calendar c = Calendar.getInstance(TIMEZONE);
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        dateFormat.setTimeZone(TIMEZONE);

        Date date = dateFormat.parse("2018-10-20T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-10-21T00:00:00");
        c.setTime(date);

        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

        date = dateFormat.parse("2018-11-04T00:00:00");
        c.setTime(date);
        System.out.println("In dst " + c.getTimeZone().inDaylightTime(c.getTime()));

    }
}

Adding further to my question I was able to figure out that daylight saving is applied by using my above program. I would like something where it should show me: On 20th October time is 9 am whereas same time due to DST shifted by 1 hr, i.e., 10 am. Is there any way to achieve this?

Expected output:

     timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

         Time is: 21-10-2018 07:52:16

Actual Output faulty JVM:

        timeZone : timeZone : sun.util.calendar.ZoneInfo[id="Brazil/East"]

       Time is: 21-10-2018 08:52:30

回答1:


I'll add a very brief answer. It shows that 1 day is not equal to 24 hours, i.e. DST changed. I also stepped over to Java 8 because I'm more familiar with it.

ZoneId timezone = ZoneId.of("Brazil/East");

ZonedDateTime t = ZonedDateTime.of(2018, 10, 20, 7, 52, 16, 0, timezone);

System.out.println(t);
System.out.println(t.plus(1, ChronoUnit.DAYS));
System.out.println(t.plus(24, ChronoUnit.HOURS));

Output:

2018-10-20T07:52:16-03:00[Brazil/East]
2018-10-21T07:52:16-02:00[Brazil/East]
2018-10-21T08:52:16-02:00[Brazil/East]




回答2:


The solution is to fix the JVM with the faulty (outdated) time zone data. It’s pretty straightforward to do using the Time Zone Updater Tool from Oracle. See the link at the bottom (for OpenJDK see the next link).

If you want to know when your JVM “thinks” that summer time (DST) began, you may use the following code:

    ZoneId zone = ZoneId.of("America/Sao_Paulo");
    ZoneRules rules = zone.getRules();
    ZoneOffsetTransition dstStarted = rules.previousTransition(Instant.now());
    System.out.println(dstStarted);

Apparently my Java 11 has the fresh time zone data where summer began on November 4. I got this output:

Transition[Gap at 2018-11-04T00:00-03:00 to -02:00]

“Gap” means that the clock was turned forward as when summer time begins. The transitions were the clock is turned backward are printed as “Overlap”.

If you want, you can also query the ZoneOffsetTransition about the local date and time before and after the transition, the instant of the transition, the UTC offset applied before and after the transition, the signed length of the transition (here 1 hour) and other information.

I am recommending java.time, the modern Java date and time API. The date-time classes that you were using — TimeZone, Calendar, DateFormat, SimpleDateFormat and Date — are all poorly designed and long outdated.

Links

  • Timezone Updater Tool (for Oracle JDK)
  • How do I update the timezone information for the OpenJDK? (credits to Matt Johnson, who provided this link in a comment)
  • Oracle tutorial: Date Time explaining how to use java.time.


来源:https://stackoverflow.com/questions/53185095/how-to-show-the-difference-in-time-after-the-daylight-saving-started-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!