Date previousTwentieth(Date d, DateGeneration.Rule rule)
{
Date result = new Date(20, d.month(), d.year());
if (result > d)
result -= new Period(1,TimeUnit.Months);
if (rule == DateGeneration.Rule.TwentiethIMM ||
rule == DateGeneration.Rule.OldCDS ||
rule == DateGeneration.Rule.CDS)
{
int m = result.month();
if (m % 3 != 0) { // not a main IMM nmonth
int skip = m%3;
result -= new Period(skip,TimeUnit.Months);
}
}
return result;
}