Возможно, это должен был быть комментарий, потому что я не могу объяснить все детали того, что пошло не так, или как вы можете это исправить.Но я вижу, что ваша проблема связана с инверсией знакового бита миллисекунд с той эпохи.Я попробовал это:
long milli = OffsetDateTime.parse("2018-12-17T21:21:45+07:00").toInstant().toEpochMilli();
milli += Long.MIN_VALUE; // Flip the sign bit
Date wrongDateAsOldfashiondDate = new Date(milli);
System.out.println(wrongDateAsOldfashiondDate);
System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(wrongDateAsOldfashiondDate));
Вывод на моем компьютере (в часовом поясе Европы / Копенгагена) был:
Fri Nov 18 08:08:49 CET 292269006
292269006-11-18
Обычно не следует использоватьстарый и плохо спроектированный класс Date
, но так я мог получить точно такой же результат, как и у вас.Отличие от современного API даты и времени состоит в том, что Date
использует юлианский календарь, поэтому, очевидно, это также использовалось программным обеспечением, дающим неожиданный результат (вероятно, класс Date
также был задействован).