Я управляю устройствами, которые сообщают свои системные часы как секунды с полуночи 01-01-1900.
Мне нужно преобразовать это в метку времени.
Пока я делаю это какследующим образом:
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
При запуске этого на моем локальном компьютере (Италия, Windows 7) я получаю следующее:
java -cp . TestTime 3752388800
1900-01-01 00:00:00
3752388800 corresponds to 2018-11-28 10:13:20
Это совершенно правильно.
Я получаюте же результаты при запуске этого на машине Linux (все еще в Италии).
Однако, запустив ту же самую программу на машине Linux в Бразилии, я получаю разные результаты:
java -cp . TestTime 3752388800
1900-01-01 00:00:00
3752388800 corresponds to 2018-11-28 11:19:48
Независимо от того,значение, которое я передаю в командной строке, разница всегда 01: 06: 28.
Есть идеи, откуда эта разница?
Кстати, меня не волнует часовой пояс.Мне просто нужна временная метка
Обновление 1:
То же самое происходит и при использовании Java 6 (которая является реальной версией, используемой в нашей производственной среде в Бразилии).
Итак, проблема не зависит от версии Java
Обновление 2:
Проблема не возникает при вводе числа секунд ниже 441763200 (что соответствует 01-01-1914 00:00:00) Остается вопрос, почему мы получаем разницу для Бразилии?