public static Date date(string immCode, Date refDate) { if (!isIMMcode(immCode, false)) { throw new ArgumentException(immCode + " is not a valid IMM code"); } Date referenceDate = (refDate ?? Settings.evaluationDate()); int m = "FGHJKMNQUVXZ".IndexOf(immCode.ToUpper()[0]) + 1; if (m == 0) { throw new ArgumentException("invalid IMM month letter"); } if (!Char.IsDigit(immCode[1])) { throw new ArgumentException(immCode + " is not a valid IMM code"); } int y = immCode[1] - '0'; y += referenceDate.Year - (referenceDate.Year % 10); /* year<10 are not valid years: to avoid a run-time * exception in few lines below we need to add 10 years right away */ if (y == 0 && referenceDate.Year <= 1909) { y += 10; } Date result = IMM.nextDate(new Date(1, m, y), false); if (result < referenceDate) { result = IMM.nextDate(new Date(1, m, y + 10), false); } return(result); }