code: def human_date_to_datetime(self, time_input, tz=None, source_datetime=None):
          
  
          c = pdt.Constants('en')
          cal = pdt.Calendar(c)
          # cal = pdt.Calendar(version=pdt.VERSION_CONTEXT_STYLE)
          tzinfo = None
          src_tzname = None
          if source_datetime is not None:
              tzinfo = source_datetime.tzinfo
              src_tzname = source_datetime.tzname()
          try:
              dt, status = cal.parseDT(time_input, sourceTime=source_datetime, tzinfo=tzinfo)
              if tz is not None:  # don't add tz if no tz value is passed
                  if dt.tzinfo is None:
                      dt = self._replace_timezone(dt)
                  # don't covert timezone if source timezone already in the correct timezone
                  if tz != src_tzname:
                      dt = dt.astimezone(timezone(tz))
              if status == 0:
                  dt = None
          except TypeError:
              dt = None
  
          return dt
docs: Convert human readable date (e.g. 30 days ago) to datetime.datetime using
              parsedatetime module.
  
          Examples:
  
          * August 25th, 2008
          * 25 Aug 2008
          * Aug 25 5pm
          * 5pm August 25
          * next saturday
          * tomorrow
          * next thursday at 4pm
          * at 4pm
          * eod
          * tomorrow eod
          * eod tuesday
          * eoy
          * eom
          * in 5 minutes
          * 5 minutes from now
          * 5 hours before now
          * 2 hours before noon
          * 2 days from tomorrow
  
          Args:
              time_input (string): The time input string (see formats above).
              tz (string): The time zone for the returned datetime.
              source_datetime (datetime.datetime): The reference or source datetime.
  
          Returns:
              (datetime.datetime): Python datetime.datetime object.