Try parse datetime from string. If None template matching this 
        datestr, raise Error.
         
        :param datetimestr: a string represent a datetime
        :type datetimestr: str
        :return: a datetime.datetime object
        
        Usage::
        
            >>> from weatherlab.lib.timelib.timewrapper import timewrapper
            >>> timewrapper.str2date("12/15/2014 06:30:00 PM")
            datetime.datetime(2014, 12, 15, 18, 30)
    
        **中文文档**
        
        尝试从字符串中解析出datetime.date对象。每次解析时, 先尝试默认模板, 如果
        失败了, 再重新对所有模板进行尝试; 一旦尝试成功, 这将当前成功的模板保存
        为默认模板。这样使得尝试的策略最优化。

def str2datetime(self, datetimestr):
        """Try parse datetime from string. If None template matching this 
        datestr, raise Error.
         
        :param datetimestr: a string represent a datetime
        :type datetimestr: str
        :return: a datetime.datetime object
        
        Usage::
        
            >>> from weatherlab.lib.timelib.timewrapper import timewrapper
            >>> timewrapper.str2date("12/15/2014 06:30:00 PM")
            datetime.datetime(2014, 12, 15, 18, 30)
    
        **中文文档**
        
        尝试从字符串中解析出datetime.date对象。每次解析时, 先尝试默认模板, 如果
        失败了, 再重新对所有模板进行尝试; 一旦尝试成功, 这将当前成功的模板保存
        为默认模板。这样使得尝试的策略最优化。
        """
        try:
            return datetime.strptime(
                    datetimestr, self.default_datetime_templates)
        except: # 如果默认的模板不匹配, 则重新尝试所有的模板
            pass
        
        # try all datetime_templates
        # 对每个template进行尝试, 如果都不成功, 抛出异常
        for template in self.datetime_templates:
            try:
                a_datetime = datetime.strptime(
                                datetimestr, template) # 如果成功了
                self.default_datetime_templates = template # 保存为default
                return a_datetime
            except:
                pass
        raise NoMatchingTemplateError(datetimestr)