The real WTF is history.
-
Had this come up as a complaint from production: adding a new customer born in 1945 failed, the birthdate was not accepted.
Try running the code below on a Sun Java 1.4 system.
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.TimeZone;public class DateTest
{
public static void main(String[] args) throws Exception
{
mung("25.09.1945", "Europe/Rome");
mung("24.09.1945", "Europe/Rome");
mung("25.09.1945", "Europe/Berlin");
mung("24.09.1945", "Europe/Berlin");
}public static void mung(String date, String timeZone) throws Exception { SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone(timeZone)); calendar.setLenient(false); calendar.setTime(dateFormat.parse(date)); calendar.set(Calendar.MILLISECOND, 0); System.out.println(timeZone + " - " + calendar.getTime()); }
}
It will fail on the last call of the mung() method, on the Calendar.getTime() call.
Turns out this is a bug in the JDK based on a history WTF. In summer 1945, Berlin and the Soviet-occupied part of Germany observed a daylight savings time of two hours. Unfortunately, Sun's JRE 1.4 implementation of GregorianCalendar defines a maximum DST of one hour and, in non-lenient mode, rejects the 2 hours as invalid when recalculating all fields after the millisecond field is set.
-
<insert standard forum software WTF comment>
Had this come up as a complaint from production: adding a new customer born in 1945 failed, the birthdate was not accepted.Try running the code below on a Sun Java 1.4 system.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
public class DateTest
{
public static void main(String[] args) throws Exception
{
mung("25.09.1945", "Europe/Rome");
mung("24.09.1945", "Europe/Rome");
mung("25.09.1945", "Europe/Berlin");
mung("24.09.1945", "Europe/Berlin");
}
public static void mung(String date, String timeZone) throws Exception
{
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone(timeZone));
calendar.setLenient(false);
calendar.setTime(dateFormat.parse(date));
calendar.set(Calendar.MILLISECOND, 0);
System.out.println(timeZone + " - " + calendar.getTime());
}
}
It will fail on the last call of the mung() method, on the Calendar.getTime() call.Turns out this is a bug in the JDK based on a history WTF. In summer 1945, Berlin and the Soviet-occupied part of Germany observed a daylight savings time of two hours.
Unfortunately, Sun's JRE 1.4 implementation of GregorianCalendar
defines a maximum DST of one hour and, in non-lenient mode, rejects the
2 hours as invalid when recalculating all fields after the millisecond
field is set.
-
I wonder if that included West Berlin?
-
@marvin_rabbit said:
I wonder if that included West Berlin?
At that time, just months after the end of WWII, there was no West
Berlin, there was an American, a British, a French and a Soviet
occupied zone, both for Berlin and for Germany as a whole.
Apparently the Soviets come up with the idea for their zones, and the
other allies also implemented it for their parts of Berlin, since
having a timezone difference of one hour within the city would have
been rather perverse. So it included both what would later become East
Germany and what would become West Berlin.
-
@brazzy said:
@marvin_rabbit said:
I wonder if that included West Berlin?
At that time, just months after the end of WWII, there was no West
Berlin, there was an American, a British, a French and a Soviet
occupied zone, both for Berlin and for Germany as a whole.
Apparently the Soviets come up with the idea for their zones, and the
other allies also implemented it for their parts of Berlin, since
having a timezone difference of one hour within the city would have
been rather perverse. So it included both what would later become East
Germany and what would become West Berlin.
I guess it wasn't DST, but Moscow time zone.
-
@brazzy said:
Turns out this is a bug in the JDK based on a history WTF. In summer 1945, Berlin and the Soviet-occupied part of Germany observed a daylight savings time of two hours.
Unfortunately, Sun's JRE 1.4 implementation of GregorianCalendar
defines a maximum DST of one hour and, in non-lenient mode, rejects the
2 hours as invalid when recalculating all fields after the millisecond
field is set.They're not the only ones; Britain apparently has something called British Double Summer Time for a while during/after WWII. I doubt there's much software out there that can handle that correctly...
-
According to Wikipedia, Newfoundland used a 2-hour jump as recently as 1988.
-
@brazzy said:
@marvin_rabbit said:
I wonder if that included West Berlin?
At that time, just months after the end of WWII, there was no West
Berlin, there was an American, a British, a French and a Soviet
occupied zone, both for Berlin and for Germany as a whole.
Apparently the Soviets come up with the idea for their zones, and the
other allies also implemented it for their parts of Berlin, since
having a timezone difference of one hour within the city would have
been rather perverse. So it included both what would later become East
Germany and what would become West Berlin.
Ah, of course. I lost track of when the 'sectors' became East/West. So you both answered my question, and set my fuzzy history straight. Thanks!
-
Nice catch. That must be the most obscure bug I've ever heard of.
I blame communism.
-
Just to be clear, we aren't blaming this on Java, are we?
Actually, as somebody who lives in the Canadian province of
Saskatchewan, I'd like to say that daylight savings time is the real
WTF.
AFAIK, it was invented right here in Saskatchewan to aid farmers whose
workday followed the sun, and during the summer their work hours were
significantly different than those of everybody else. So, shift
the "time" to line up with the sun's patterns and all is well.
Since then we are now one of the few places in the world who do NOT use
daylight savings time. If we invented it for our own benefit, and
decided it was pointless enough to drop it, why does the rest of the
world keep using it? The only logical answer I can comprehend is
that, having adopted (for the same fallacious reasons that we did),
it's more of a hassle to try and change back than to just live with
it. Probably the same reason why every now and then the idea
comes up here to re-adopt DST (namely, that the time difference between
us and everybody else changes twice a year).
A great example of the problem of backwards compatiability.
"Nobody said it was a good idea, but it's more trouble to fix it than
it is to just deal with it."
-
@RevEng said:
Just to be clear, we aren't blaming this on Java, are we?
Yes, we are. Not allowing DST of 2 hours is a bug in Java 1.4. It was
not present in 1.3, and it was fixed for 1.5. Here's the bug report:
As for who invented daylight savings time, it was the Irish, in 1916,
though the first to implement it were the Germans. The reason was to
save power on lighting, which is why it was implemented in the two
world wars and again after the 1973 oil crisis. And no, it doesn't
really have the desired effect.