nodes: 0, module; 1, function_definition; 2, function_name:getBounds; 3, parameters; 4, block; 5, identifier:self; 6, default_parameter; 7, expression_statement; 8, if_statement; 9, return_statement; 10, identifier:tzinfo; 11, None; 12, comment:"""
          Return a pair describing the bounds of self.
  
          This returns a pair (min, max) of Time instances. It is not quite the
          same as (self, self + self.resolution). This is because timezones are
          insignificant for instances with a resolution greater or equal to 1
          day.
  
          To illustrate the problem, consider a Time instance::
  
              T = Time.fromHumanly('today', tzinfo=anything)
  
          This will return an equivalent instance independent of the tzinfo used.
          The hour, minute, and second of this instance are 0, and its resolution
          is one day.
  
          Now say we have a sorted list of times, and we want to get all times
          for 'today', where whoever said 'today' is in a timezone that's 5 hours
          ahead of UTC. The start of 'today' in this timezone is UTC 05:00. The
          example instance T above is before this, but obviously it is today.
  
          The min and max times this returns are such that all potentially
          matching instances are within this range. However, this range might
          contain unmatching instances.
  
          As an example of this, if 'today' is April first 2005, then
          Time.fromISO8601TimeAndDate('2005-04-01T00:00:00') sorts in the same
          place as T from above, but is not in the UTC+5 'today'.
  
          TIME IS FUN!
          """; 13, boolean_operator; 14, block; 15, else_clause; 16, tuple; 17, comparison_operator:self.resolution >= datetime.timedelta(days=1); 18, line_continuation:\; 19, comparison_operator:tzinfo is not None; 20, expression_statement; 21, block; 22, call; 23, call; 24, attribute; 25, call; 26, identifier:tzinfo; 27, None; 28, assignment; 29, expression_statement; 30, identifier:min; 31, argument_list; 32, identifier:max; 33, argument_list; 34, identifier:self; 35, identifier:resolution; 36, attribute; 37, argument_list; 38, identifier:time; 39, call; 40, assignment; 41, call; 42, call; 43, call; 44, call; 45, identifier:datetime; 46, identifier:timedelta; 47, keyword_argument; 48, attribute; 49, argument_list; 50, identifier:time; 51, attribute; 52, attribute; 53, argument_list; 54, attribute; 55, argument_list; 56, attribute; 57, argument_list; 58, attribute; 59, argument_list; 60, identifier:days; 61, integer:1; 62, attribute; 63, identifier:replace; 64, keyword_argument; 65, identifier:self; 66, identifier:_time; 67, identifier:self; 68, identifier:fromDatetime; 69, identifier:time; 70, identifier:self; 71, identifier:fromDatetime; 72, attribute; 73, identifier:self; 74, identifier:fromDatetime; 75, binary_operator:time + self.resolution; 76, identifier:self; 77, identifier:fromDatetime; 78, binary_operator:self._time + self.resolution; 79, identifier:self; 80, identifier:_time; 81, identifier:tzinfo; 82, identifier:tzinfo; 83, identifier:self; 84, identifier:_time; 85, identifier:time; 86, attribute; 87, attribute; 88, attribute; 89, identifier:self; 90, identifier:resolution; 91, identifier:self; 92, identifier:_time; 93, identifier:self; 94, identifier:resolution
code: def getBounds(self, tzinfo=None):
          """
          Return a pair describing the bounds of self.
  
          This returns a pair (min, max) of Time instances. It is not quite the
          same as (self, self + self.resolution). This is because timezones are
          insignificant for instances with a resolution greater or equal to 1
          day.
  
          To illustrate the problem, consider a Time instance::
  
              T = Time.fromHumanly('today', tzinfo=anything)
  
          This will return an equivalent instance independent of the tzinfo used.
          The hour, minute, and second of this instance are 0, and its resolution
          is one day.
  
          Now say we have a sorted list of times, and we want to get all times
          for 'today', where whoever said 'today' is in a timezone that's 5 hours
          ahead of UTC. The start of 'today' in this timezone is UTC 05:00. The
          example instance T above is before this, but obviously it is today.
  
          The min and max times this returns are such that all potentially
          matching instances are within this range. However, this range might
          contain unmatching instances.
  
          As an example of this, if 'today' is April first 2005, then
          Time.fromISO8601TimeAndDate('2005-04-01T00:00:00') sorts in the same
          place as T from above, but is not in the UTC+5 'today'.
  
          TIME IS FUN!
          """
          if self.resolution >= datetime.timedelta(days=1) \
          and tzinfo is not None:
              time = self._time.replace(tzinfo=tzinfo)
          else:
              time = self._time
  
          return (
              min(self.fromDatetime(time), self.fromDatetime(self._time)),
              max(self.fromDatetime(time + self.resolution),
                  self.fromDatetime(self._time + self.resolution))
          )