@Jon Skeet answer is correct and direct. I just wanted to add more details about what is happening and why you got these results (as you in the comments ), and John also answered with a hint, which is also correct).
Your default JVM time zone is probably Europe/London (or any other that has a DST change on March 24 th 1918 ). You can verify this using DateTimeZone.getDefault() in Joda-Time and ZoneId.systemDefault() in Java 8.
The start date that you created in Jod is 1900-01-01T00:00Z ( January 1 st 1900 at midnight in UTC ). The end date, however, is only created using the year, month, and day. But DateTime also requires time (hour / minute / second / millisecond) and time zone. Since they are not specified, it sets midnight to the JVM time zone by default (which is not guaranteed by UTC - depending on the configuration of the JVM, you may get a different result).
Assuming your default time zone is London (how could I reproduce the problem), this is not happening in my default JVM time zone ( America/Sao_Paulo )). In March 2010, there was DST in London, so when you create an end date from 1918-03-25 , the result is: March 25 th 1981 at midnight in the London timezone - but because of the DST change, the result is 1918-03-25T00:00+01:00 - during DST, London uses the offset +01:00 , which means that it is one hour ahead of UTC (so this end date is equivalent to 1918-03-24T23:00Z - or March 24 th 1981 at 11:00 in UTC ).
Thus, the difference in hours is 159767, which is not enough to complete 6657 days, so the difference is 6656 days (rounding is always to the lowest value - the difference must be at least 159768 hours to complete 6657 days).
If you use LocalDate , then the time and effects of DST are not taken into account (a LocalDate has only day, month and year), and you get the correct difference. If you set the end date to UTC, you will also get the correct results, because UTC has no DST changes.
By the way, if you use Java 8 ZonedDateTime and use start date with UTC and end date with London time zone (instead of using LocalDate ), you will get the same difference in results.
Not directly related, but in Joda-Time you can use the DateTimeZone.UTC constant to indicate UTC - calling forID("UTC") redundant, since it returns a constant anyway ( DateTimeZone.forID("UTC")==DateTimeZone.UTC returns true ).