LocalDate only handles the prolusive gregorian calendar . From javadoc :
The ISO-8601 calendar system is a modern civil calendar system today in most countries of the world. This is equivalent to the prolific Gregorian calendar system, in which today the rules for leap years apply at all times. For most applications written today, the ISO-8601 Rules are fully suitable. However, any application that uses historical dates and requires that they be accurate find the ISO-8601 approach unsuitable.
In contrast, the old java.util.GregorianCalendar class (also indirectly used in toString () - the output of java.util.Date ) uses a custom gregorian cut-off by default, equal to 1582-10-15, as the separation date between the julian and gregorian rules the calendar.
So LocalDate not used for any historical dates.
But keep in mind that even java.util.GregorianCalendar often fails even when configured with the correct region-specific clipping date. For example, Great Britain began the year March 25 to 1752. And in many countries there are many more historical deviations. Outside Europe, even the Julian calendar cannot be used before the introduction of the gregorian calendar (or is best used only from the point of view of the colonizer).
UPDATE due to questions in the comment:
To explain the value of -14830974000000 , consider the following code and its output:
SimpleDateFormat format = new SimpleDateFormat("MMddyyyy", Locale.US); format.setTimeZone(TimeZone.getTimeZone("America/New_York")); Date d = format.parse("01011500"); long t1500 = d.getTime(); long tCutOver = format.parse("10151582").getTime(); System.out.println(t1500); // -14830974000000 System.out.println(tCutOver); // default gregorian cut off day in "epoch millis" System.out.println((tCutOver - t1500) / 1000); // output: 2611699200 = 30228 * 86400
It should be noted that the value of -12219292800000L indicated in your previous comment is 5 hours different from tCutOver due to the time zone offset difference between America/New_York and UTC . Thus, in the EST time zone (America / New_York), we have a difference of 30,228 days. For the time in question, we apply the rules of the Julian calendar, every fourth year of which is a leap year.
Between 1500 and 1582 we have 82 * 365 days + 21 temporal days. Then we also need to add 273 days between 1582-01-01 and 1582-10-01, finally, 4 days before shutdown (remember that October 4 follows October 15). Total: 82 * 365 + 21 + 273 + 4 = 30,228 (which should have been proven).
Please explain to me why you expected a value other than -14830974000000 ms. It looks right for me, because it handles the clockwise offset of your system, the rules of the Julian calendar until 1582 and the transition from October 4, 1582 to the cut-off date 1582-10-15. So, for me, your question is: "How do I tell a date object to return ms to the correct Gregorian date?" already answered - no corrections required. Keep in mind that this complex material has been used in manufacturing for quite some time and, as you might expect, will work correctly after so many years.
If you really want to use JSR-310 for this material, I repeat that there is no gregorian cut-over date support. Best of all, you can do your own work.
For example, you might consider the external Threeten-Extra library, which has a prolific Julian calendar since 0.9. But it will still be your desire to deal with the break between the old Julian calendar and the new gregorian calendar. (And do not expect such libraries to be able to handle REAL historical dates due to many other reasons, such as the start of a new year, etc.)
2017 Update: Another more powerful option: The HistoricCalendar of my Time4J library, which handles much more than just a julian / gregorian-cutover.