docs: def toSolarDate(self):
          '''
          >>> LunarDate(1900, 1, 1).toSolarDate()
          datetime.date(1900, 1, 31)
          >>> LunarDate(2008, 9, 4).toSolarDate()
          datetime.date(2008, 10, 2)
          >>> LunarDate(1976, 8, 8, 1).toSolarDate()
          datetime.date(1976, 10, 1)
          >>> LunarDate(2004, 1, 30).toSolarDate()
          Traceback (most recent call last):
          ...
          ValueError: day out of range
          >>> LunarDate(2004, 13, 1).toSolarDate()
          Traceback (most recent call last):
          ...
          ValueError: month out of range
          >>> LunarDate(2100, 1, 1).toSolarDate()
          Traceback (most recent call last):
          ...
          ValueError: year out of range [1900, 2100)
          >>>
          '''
          def _calcDays(yearInfo, month, day, isLeapMonth):
              isLeapMonth = int(isLeapMonth)
              res = 0
              ok = False
              for _month, _days, _isLeapMonth in self._enumMonth(yearInfo):
                  if (_month, _isLeapMonth) == (month, isLeapMonth):
                      if 1 <= day <= _days:
                          res += day - 1
                          return res
                      else:
                          raise ValueError("day out of range")
                  res += _days
  
              raise ValueError("month out of range")
  
          offset = 0
          start_year = 1900
          end_year = start_year + len(yearInfos)
          if start_year < 1900 or self.year >= end_year:
              raise ValueError('year out of range [{}, {})'.format(start_year, end_year))
          yearIdx = self.year - 1900
          for i in range(yearIdx):
              offset += yearDays[i]
  
          offset += _calcDays(yearInfos[yearIdx], self.month, self.day, self.isLeapMonth)
          return self._startDate + datetime.timedelta(days=offset)