problems with Java daylight savings time

后端 未结 4 1113
长情又很酷
长情又很酷 2021-01-05 01:35

I have a Java app that needs to be cognizant of the time zone. When I take a Unix epoch time and try to convert it into a timestamp to use for an Oracle SQL call, it is get

相关标签:
4条回答
  • 2021-01-05 01:58

    the timezone useDaylightTime value is not correct, i.e., it is currently returning "true", when we are NOT in DST

    I think you're confusing useDaylightTime with inDaylightTime. The former tells you whether there is a transition between daylight time and standard time in the future, not which side of that transition you're on. For example, it returns false for Chinese time zones because China does not adjust for daylight savings time, but it returns true for most US time zones because most US states (except Arizona) do observe daylight savings time.

    inDaylightTime

    public abstract boolean inDaylightTime(Date date)
    

    Queries if the given date is in Daylight Saving Time in this time zone.

    vs

    useDaylightTime

    public abstract boolean useDaylightTime()
    

    Queries if this TimeZone uses Daylight Saving Time. If an underlying TimeZone implementation subclass supports historical and future Daylight Saving Time schedule changes, this method refers to the last known Daylight Saving Time rule that can be a future prediction and may not be the same as the current rule. Consider calling observesDaylightTime() if the current rule should also be taken into account.

    0 讨论(0)
  • 2021-01-05 02:08

    If you want to disable daylight saving calculation, then you must set your timezone to EST. Else otherwise time will be calculated based on default time zone set for AMERICA/NEW_YORK

           TimeZone zoneEST = TimeZone.getTimeZone("EST"); 
           System.out.println(zoneEST.getDSTSavings());  //0 hour
           System.out.println(zoneEST.getRawOffset());  //5 hour
           TimeZone.setDefault(zoneEST);
           System.out.println("");
    
           TimeZone zoneNY = TimeZone.getTimeZone("America/New_York");
           System.out.println(zoneNY.getDSTSavings()); // 1 hour
           System.out.println(zoneNY.getRawOffset()); // 5 hour
    
    0 讨论(0)
  • 2021-01-05 02:18
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.TimeZone;
    
    public class TimeZoneTest {
        public static void main(String[] argv) throws ParseException {
    
            SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
    
            String dateInString = "22-01-2015 10:15:55 AM";
            Date date = formatter.parse(dateInString);
            TimeZone tz = TimeZone.getDefault();
    
            // From TimeZone Asia/Singapore
            System.out.println("TimeZone : " + tz.getID() + " - " + tz.getDisplayName());
            System.out.println("TimeZone : " + tz);
            System.out.println("Date : " + formatter.format(date));
    
            // To TimeZone America/New_York
            SimpleDateFormat sdfAmerica = new SimpleDateFormat("dd-M-yyyy hh:mm:ss a");
            TimeZone tzInAmerica = TimeZone.getTimeZone("America/New_York");
            sdfAmerica.setTimeZone(tzInAmerica);
    
            String sDateInAmerica = sdfAmerica.format(date); // Convert to String first
            Date dateInAmerica = formatter.parse(sDateInAmerica);
    
            System.out.println("\nTimeZone : " + tzInAmerica.getID() + 
                                          " - " + tzInAmerica.getDisplayName());
            System.out.println("TimeZone : " + tzInAmerica);
            System.out.println("Date (String) : " + sDateInAmerica);
            System.out.println("Date (Object) : " + formatter.format(dateInAmerica)); 
        }
    
    }
    
    0 讨论(0)
  • 2021-01-05 02:22

    I have found a way to ensure the daylight saving is ignored

    TimeZone tz = TimeZone.getTimeZone("GMT");
    TimeZone.setDefault(tz);
    GregorianCalendar calendar;
    calendar = new GregorianCalendar();
    

    Set the timezone before you create your GregorianCalendar object

    0 讨论(0)
提交回复
热议问题