public static bool isLastDayOfFebruary(SerialDate d)
 {
   if (d.getMonth() != 2)
     return false;
   int dayOfMonth = d.getDayOfMonth();
   if (SerialDate.isLeapYear(d.getYYYY()))
     return dayOfMonth == 29;
   else
     return dayOfMonth == 28;
 }
 public static int dayCount30(SerialDate start, SerialDate end)
 {
   if (!start.isBefore(end))
     return -SerialDateUtilities.dayCount30(end, start);
   int dayOfMonth1 = start.getDayOfMonth();
   int month1 = start.getMonth();
   int yyyy = start.getYYYY();
   int dayOfMonth2 = end.getDayOfMonth();
   int month2 = end.getMonth();
   return 360 * (end.getYYYY() - yyyy) + 30 * (month2 - month1) + (dayOfMonth2 - dayOfMonth1);
 }
 public static int dayCount30ISDA(SerialDate start, SerialDate end)
 {
   if (start.isBefore(end))
   {
     int num1 = start.getDayOfMonth();
     int month1 = start.getMonth();
     int yyyy1 = start.getYYYY();
     if (num1 == 31)
       num1 = 30;
     int num2 = end.getDayOfMonth();
     int month2 = end.getMonth();
     int yyyy2 = end.getYYYY();
     if (num2 == 31 && num1 == 30)
       num2 = 30;
     return 360 * (yyyy2 - yyyy1) + 30 * (month2 - month1) + (num2 - num1);
   }
   else if (start.isAfter(end))
     return -SerialDateUtilities.dayCount30ISDA(end, start);
   else
     return 0;
 }
 public static int dayCount30PSA(SerialDate start, SerialDate end)
 {
   if (!start.isOnOrBefore(end))
     return -SerialDateUtilities.dayCount30PSA(end, start);
   int num1 = start.getDayOfMonth();
   int month1 = start.getMonth();
   int yyyy1 = start.getYYYY();
   if (SerialDateUtilities.isLastDayOfFebruary(start))
     num1 = 30;
   if (num1 == 31 || SerialDateUtilities.isLastDayOfFebruary(start))
     num1 = 30;
   int num2 = end.getDayOfMonth();
   int month2 = end.getMonth();
   int yyyy2 = end.getYYYY();
   if (num2 == 31 && num1 == 30)
     num2 = 30;
   return 360 * (yyyy2 - yyyy1) + 30 * (month2 - month1) + (num2 - num1);
 }