Joda Time 2.0 made a change to fix bug 2952991.
From the blurb in the documentation, one would expect that, when creating a DateTime during a DST overlap, it would pick the time zone that creates the earliest instant in time (ie. summer time).
This is indeed the case, e.g.:
LocalDateTime local = new LocalDateTime(2012, 11, 4, 1, 30, 0);
DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
DateTime dt = local.toDateTime(tz);
dt is (Joda Time 2.1) 2012-11-04T01:30:00.000-07:00 - 2012-11-04T08:30:00.000Z
However, if you do:
DateTime dt = local.toLocalDate().toDateTime(local.toLocalTime(), tz);
dt is 2012-11-04T01:30:00.000-08:00 - 2012-11-04T09:30:00.000Z
In both cases, using withEarlier or withLaterOffsetAtOverlap correctly produce:
Earlier Offset: 2012-11-04T01:30:00.000-07:00 - 2012-11-04T08:30:00.000Z
Later Offset : 2012-11-04T01:30:00.000-08:00 - 2012-11-04T09:30:00.000Z
Is the difference here a bug or by design?
I tried to get the behaviour in all the different places reasonably consistent, but unfortunately, the internal design isn't conducive to simple fixes or tweaks. Your code looks "non-ideal", but with the easy offset-control solution, I'd be reluctant to try and look at that hairy code again!