docs: def _parse_canonical_datetime(doc, json_options):
      """Decode a JSON datetime to python datetime.datetime."""
      dtm = doc["$date"]
      if len(doc) != 1:
          raise TypeError('Bad $date, extra field(s): %s' % (doc,))
      # mongoexport 2.6 and newer
      if isinstance(dtm, string_type):
          # Parse offset
          if dtm[-1] == 'Z':
              dt = dtm[:-1]
              offset = 'Z'
          elif dtm[-3] == ':':
              # (+|-)HH:MM
              dt = dtm[:-6]
              offset = dtm[-6:]
          elif dtm[-5] in ('+', '-'):
              # (+|-)HHMM
              dt = dtm[:-5]
              offset = dtm[-5:]
          elif dtm[-3] in ('+', '-'):
              # (+|-)HH
              dt = dtm[:-3]
              offset = dtm[-3:]
          else:
              dt = dtm
              offset = ''
  
          # Parse the optional factional seconds portion.
          dot_index = dt.rfind('.')
          microsecond = 0
          if dot_index != -1:
              microsecond = int(float(dt[dot_index:]) * 1000000)
              dt = dt[:dot_index]
  
          aware = datetime.datetime.strptime(
              dt, "%Y-%m-%dT%H:%M:%S").replace(microsecond=microsecond,
                                               tzinfo=utc)
  
          if offset and offset != 'Z':
              if len(offset) == 6:
                  hours, minutes = offset[1:].split(':')
                  secs = (int(hours) * 3600 + int(minutes) * 60)
              elif len(offset) == 5:
                  secs = (int(offset[1:3]) * 3600 + int(offset[3:]) * 60)
              elif len(offset) == 3:
                  secs = int(offset[1:3]) * 3600
              if offset[0] == "-":
                  secs *= -1
              aware = aware - datetime.timedelta(seconds=secs)
  
          if json_options.tz_aware:
              if json_options.tzinfo:
                  aware = aware.astimezone(json_options.tzinfo)
              return aware
          else:
              return aware.replace(tzinfo=None)
      return bson._millis_to_datetime(int(dtm), json_options)