public static DateTime LunarToSolar(LunarDate ld, int timeZone)
 {
     long k, a11, b11, off, leapOff, leapMonth, monthStart;
     if (ld.Month < 11)
     {
         a11 = LunarYearTools.getLunarMonth11(ld.Year - 1, timeZone);
         b11 = LunarYearTools.getLunarMonth11(ld.Year, timeZone);
     }
     else
     {
         a11 = LunarYearTools.getLunarMonth11(ld.Year, timeZone);
         b11 = LunarYearTools.getLunarMonth11(ld.Year + 1, timeZone);
     }
     k = LunarYearTools.INT(0.5 + (a11 - 2415021.076998695) / 29.530588853);
     off = ld.Month - 11;
     if (off < 0)
     {
         off += 12;
     }
     if (b11 - a11 > 365)
     {
         leapOff = LunarYearTools.getLeapMonthOffset(a11, timeZone);
         leapMonth = leapOff - 2;
         if (leapMonth < 0)
         {
             leapMonth += 12;
         }
         if (ld.IsLeapYear && ld.Month != leapMonth)
         {
             return DateTime.MinValue;
         }
         else if (ld.IsLeapYear || off >= leapOff)
         {
             off += 1;
         }
     }
     monthStart = LunarYearTools.getNewMoonDay(k + off, timeZone);
     return LunarYearTools.jdToDate(monthStart + ld.Day - 1);
 }
 /* Convert a lunar date to the corresponding solar date */
 public static DateTime LunarToSolar(LunarDate ld)
 {
     return LunarToSolar(ld, 7);
 }