În numărul 104 vă prezentam un bug ce se reproducea o dată la 23 de ani, într-un sistem informatic folosit pentru navigație aeriană și lansam un concurs pentru rezolvarea lui.
Cele mai bune soluții au venit de la Remus Gabor, Product Owner la o firmă din Cluj-Napoca și Ovidiu Zakarias, QA Automation Engineer tot din Cluj-Napoca.
Aceștia au fost premiați deja de Frequentis România și le transmitem felicitări încă odată.
Metoda de mai jos convertește un cod AIRAC Cycle într-un timestamp, iar pentru fixarea bugului, a fost necesar să se țină cont de anii bisecți și de faptul că o dată la 23 de ani există 14 cicluri AIRAC.
public String transformAIRACDateToISO(String airacCycle) {
if (airacCycle != null && airacCycle.length() >= 4) {
int year = Integer.parseInt(airacCycle.substring(0, 2));
int cycle = Integer.parseInt(airacCycle.substring(2, 4));
DateTime startingDateRef = new DateTime(2010, 1, 14, 0, 0, DateTimeZone.UTC);
DateTime lastDayFromPrevYear = new DateTime(2000 + year - 1, 12, 31, 0, 0, DateTimeZone.UTC);
int remainingDaysFromPrevYear = Days.daysBetween(startingDateRef, lastDayFromPrevYear).getDays() % 28;
return ISODateTimeFormat.dateTime()
.print(lastDayFromPrevYear
.plusDays(28 - remainingDaysFromPrevYear + (cycle - 1) * 28));
}
return "2012-06-28T00:00:00.000Z";
}
Iar acesta e unit testul aferent:
@Test
public void testTransformAIRACtoISO() {
assertEquals("2020-12-31T00:00:00.000Z",
transformAIRACDateToISO("2014"));
assertEquals("2021-01-28T00:00:00.000Z",
transformAIRACDateToISO("2101"));
assertEquals("2022-12-29T00:00:00.000Z",
transformAIRACDateToISO("2213"));
assertEquals("2043-12-31T00:00:00.000Z",
transformAIRACDateToISO("4314"));
assertEquals("2044-01-28T00:00:00.000Z",
transformAIRACDateToISO("4401"));
}
de Dan Sabadis
de Sorin Stan
de Ovidiu Mățan
de Ovidiu Mățan