Convert seconds since 01-01-1900 to timestamp in Brazil

  • A+
Category:Languages

I'm managing devices that report their system clock as seconds since midnight 01-01-1900.
I need to convert this into a timestamp.

So far, I'm doing this as follows:

import java.text.SimpleDateFormat; import java.util.Calendar;  public class TestTime {   // Pass seconds since 01-01-1900 00:00:00 on the command line   public static void main(String[] args)   {     // ---------------------     // Create time formatter     // ---------------------     SimpleDateFormat format;     format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      // ---------------------------     // Compose 01-01-1900 00:00:00     // ---------------------------     Calendar cal;     cal = Calendar.getInstance();     cal.set(Calendar.YEAR, 1900);     cal.set(Calendar.MONTH, Calendar.JANUARY);     cal.set(Calendar.DAY_OF_MONTH, 1);     cal.set(Calendar.HOUR_OF_DAY, 0);     cal.set(Calendar.MINUTE, 0);     cal.set(Calendar.SECOND, 0);     cal.set(Calendar.MILLISECOND, 0);      // -------------------     // Show what we've got     // -------------------     System.out.println(format.format(cal.getTime()));      // ---------------------------------------------     // Add the seconds as passed on the command line     // ---------------------------------------------     long secs = Long.parseLong(args[0]);     while (secs > Integer.MAX_VALUE)     {       cal.add(Calendar.SECOND, Integer.MAX_VALUE);       secs -= Integer.MAX_VALUE;     }     cal.add(Calendar.SECOND, (int)secs);      // -------------------     // Show what we've got     // -------------------     System.out.println(args[0] + " corresponds to " + format.format(cal.getTime()));    } // main  } // class TestTime 

When running this on my local PC (Italy, Windows 7), I get the following:

java -cp . TestTime 3752388800 1900-01-01 00:00:00 3752388800 corresponds to 2018-11-28 10:13:20 

This is perfectly correct.
I get the same results when running this on a Linux machine (still in Italy).

However, running the very same program on a Linux machine in Brazil, I get different results:

java -cp . TestTime 3752388800 1900-01-01 00:00:00 3752388800 corresponds to 2018-11-28 11:19:48 

Whatever value I pass on the commandline, the difference is always 01:06:28.
Any idea where this difference is coming from?

BTW, I'm not concerned about the timezone. I just need a timestamp

Update 1:
The very same thing happens also when using Java 6 (which is the actual version used within our production environment in Brazil).
So, the problem does not depend on the java version

Update 2:
The problem does not occur when entering a number of seconds below 441763200 (which corresponds to 01-01-1914 00:00:00) The question remains why we get a difference for Brazil?

 


Have a look at this site: https://www.timeanddate.com/time/zone/brazil/sao-paulo and navigate to Time zone changes for: 1900-1924. There you can see an offset of -03:06:28 to UTC before 01-01-1914. It is exactly the same reason as in Why is subtracting these two times (in 1927) giving a strange result?

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: