def from_string(time_string):
     if CMN_FUNC.check_date_str_format(time_string):
         return FinanceDate.from_string(time_string)
     elif CMN_FUNC.check_month_str_format(time_string):
         return FinanceMonth.from_string(time_string)
     elif CMN_FUNC.check_quarter_str_format(time_string):
         return FinanceQuarter.from_string(time_string)
     else:
         ValueError("Unknown time format: %s" % time_string)
    def __init__(self, *args):
        super(FinanceDate, self).__init__()
        self.month = None # range: 1 - 12
        self.day = None # range: 1 - last date of month
        self.date_str = None
        self.datetime_cfg = None
        try:
            if len(args) == 1:
                time_cfg = None
                if isinstance(args[0], str):
                    mobj = CMN_FUNC.check_date_str_format(args[0])
                    self.setup_year_value(mobj.group(1))
                    # self.year = mobj.group(1)
                    self.month = int(mobj.group(2))
                    self.day = int(mobj.group(3))
                elif isinstance(args[0], datetime):
                    self.setup_year_value(args[0].year)
                    # self.year = args[0].year
                    self.month = args[0].month
                    self.day = args[0].day   
                else:
                    raise
            elif len(args) == 3:
                for index in range(3):
                    if type(args[index]) is not int:
                        raise
                self.setup_year_value(args[0])
                # self.year = args[0]
                self.month = args[1]
                self.day = args[2]
            else:
                raise
        except Exception:
            raise ValueError("Unknown argument in FormatDate format: %s" % args)
# Check value range
        FinanceDate.check_value_range(self.year, self.month, self.day)