Skip to main content

chained_mode_time_tool

Project description

纯面向对象,支持链式操作的时间转换。

pip install chained_mode_time_tool

 时间转换,支持链式操作,纯面向对象的的。
 无限链式操作之后,通过对象的 datetime_obj datetime_str 等属性和方法,取得自己想要的值。

相比模块级下面定义几十个函数,然后将不同类型的时间变量传到不同的函数中return结果,然后把结果作为入参传入到另一个函数进行转换,
纯面向对象支持链式转换的要方便很多。

初始化能够接受的变量类型丰富,可以传入一切类型的时间变量,兼容性和容错度高。::

例如不支持链式操作的,并且需要使用不同的函数处理不同的时间变量类型的是这样的

https://github.com/lishenluo/dtutils/blob/master/DTUtils.py

支持链式操作和不支持链式操作的调用写法区别是:

支持链式操作是:
from modulexx import  DatetimeConverter 
DatetimeConverter(var).fun1.fun2.fun3.attr

不支持链式是:
import modulexx
modulexx.fun4((modulexx.fun3(modulexx.fun2(modulexx.fun1(var)))))
import typing
import re
import time
import datetime


class DatetimeConverter:
    """ 时间转换,支持链式操作,纯面向对象的的。

    相比模块级下面定义几十个函数,然后将不同类型的时间变量传到不同的函数中return结果,然后把结果作为入参传入到另一个函数进行转换,
    纯面向对象支持链式转换的要方便很多。

    初始化能够接受的变量类型丰富,可以传入一切类型的时间变量。

    """
    DATETIME_FORMATTER = "%Y-%m-%d %H:%M:%S"
    DATETIME_FORMATTER2 = "%Y-%m-%d"
    DATETIME_FORMATTER3 = "%H:%M:%S"

    @classmethod
    def bulid_conveter_with_other_formatter(cls, datetime_str, datetime_formatter):
        """
        :param datetime_str: 时间字符串
        :param datetime_formatter: 能够格式化该字符串的模板
        :return:
        """
        datetime_obj = datetime.datetime.strptime(datetime_str, datetime_formatter)
        return cls(datetime_obj)

    def __init__(self, datetimex: typing.Union[None,int, float, datetime.datetime, str, 'DatetimeConverter'] = None):
        """
        :param datetimex: 接受时间戳  datatime类型 和 时间字符串 和类对象本身四种类型,如果为None,则默认当前时间。
        """
        if isinstance(datetimex, str):
            if not re.match('\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', datetimex):
                raise ValueError('时间字符串的格式不符合此传参的规定,如果是其他格式的时间字符串,'
                                 '可以使用 bulid_conveter_with_other_formatter方法来生成对象')
            else:
                self.datetime_obj = datetime.datetime.strptime(datetimex, self.DATETIME_FORMATTER)
        elif isinstance(datetimex, (int, float)):
            if datetimex < 1:
                datetimex += 86400
            self.datetime_obj = datetime.datetime.fromtimestamp(datetimex)  # 时间戳0在windows会出错。
        elif isinstance(datetimex, datetime.datetime):
            self.datetime_obj = datetimex
        elif isinstance(datetimex, DatetimeConverter):
            self.datetime_obj = datetimex.datetime_obj
        elif datetimex is None:
            self.datetime_obj = datetime.datetime.now()
        else:
            raise ValueError('实例化时候的传参不符合规定')
        
    # 以下为常用的属性
    @property
    def datetime_str(self) -> str:
        return self.datetime_obj.strftime(self.DATETIME_FORMATTER)

    @property
    def time_str(self) -> str:
        return self.datetime_obj.strftime(self.DATETIME_FORMATTER3)

    @property
    def date_str(self) -> str:
        return self.datetime_obj.strftime(self.DATETIME_FORMATTER2)

    def get_str_by_specify_formatter(self, specify_formatter='%Y-%m-%d %H:%M:%S'):
        return self.datetime_obj.strftime(specify_formatter)

    @property
    def timestamp(self) -> float:
        return self.datetime_obj.timestamp()

    def is_greater_than_now(self) -> bool:
        return self.timestamp > time.time()

    def __str__(self) -> str:
        return self.datetime_str

    def __call__(self) -> datetime.datetime:
        return self.datetime_obj

    # 以下为不常用的辅助方法。
    def get_converter_by_interval_seconds(self, seconds_interval) -> 'DatetimeConverter':
        return self.__class__(self.datetime_obj + datetime.timedelta(seconds=seconds_interval))

    def get_converter_by_interval_minutes(self, minutes_interval) -> 'DatetimeConverter':
        return self.__class__(self.datetime_obj + datetime.timedelta(seconds=minutes_interval))

    def get_converter_by_interval_hour(self, hour_interval) -> 'DatetimeConverter':
        return self.__class__(self.datetime_obj + datetime.timedelta(hours=hour_interval))

    def get_converter_by_interval_days(self, days_interval) -> 'DatetimeConverter':
        return self.__class__(self.datetime_obj + datetime.timedelta(days=days_interval))

    @property
    def one_hour_ago_converter(self) -> 'DatetimeConverter':
        """
        酒店经常需要提前一小时免费取消,直接封装在这里
        :return:
        """
        one_hour_ago_datetime_obj = self.datetime_obj + datetime.timedelta(hours=-1)
        return self.__class__(one_hour_ago_datetime_obj)

    @property
    def one_day_ago_converter(self) -> 'DatetimeConverter':
        one_hour_ago_datetime_obj = self.datetime_obj + datetime.timedelta(days=-1)
        return self.__class__(one_hour_ago_datetime_obj)

    @property
    def next_day_converter(self) -> 'DatetimeConverter':
        one_hour_ago_datetime_obj = self.datetime_obj + datetime.timedelta(days=1)
        return self.__class__(one_hour_ago_datetime_obj)


def seconds_to_hour_minute_second(seconds):
    """
    把秒转化成还需要的时间
    :param seconds:
    :return:
    """
    m, s = divmod(seconds, 60)
    h, m = divmod(m, 60)
    return "%02d:%02d:%02d" % (h, m, s)


if __name__ == '__main__':
    import nb_log

    """
    1557113661.0
    '2019-05-06 12:34:21'
    '2019/05/06 12:34:21'
    DatetimeConverter(1557113661.0)()
    """
    # noinspection PyShadowingBuiltins
    o3 = DatetimeConverter('2019-05-06 12:34:21')
    print(DatetimeConverter(o3))
    print(o3)
    print(o3.next_day_converter.next_day_converter.next_day_converter)  # 可以无限链式。
    print('- - - - -  - - -')
    o = DatetimeConverter.bulid_conveter_with_other_formatter('2019/05/06 12:34:21', '%Y/%m/%d %H:%M:%S')
    print(o)
    print(o.get_str_by_specify_formatter('%Y %m %dT%H:%M:%S'))
    print(o.date_str)
    print(o.timestamp)
    print('***************')
    o2 = o.one_hour_ago_converter
    print(o2)
    print(o2.date_str)
    print(o2.timestamp)
    print(o2.is_greater_than_now())
    print(o2(), type(o2()))
    print(DatetimeConverter())
    print(datetime.datetime.now())
    time.sleep(5)
    print(DatetimeConverter())
    print(datetime.datetime.now())
    print(DatetimeConverter(3600 * 24))

    print(seconds_to_hour_minute_second(3600 * 2.3))

    print(DatetimeConverter('2019-05-06 12:34:21').one_hour_ago_converter.one_hour_ago_converter)
    print(DatetimeConverter(
        1596985665).one_hour_ago_converter.one_hour_ago_converter)
    print(DatetimeConverter(
        datetime.datetime(year=2020, month=5, day=4)).one_hour_ago_converter.one_hour_ago_converter)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chained_mode_time_tool-0.4.tar.gz (5.1 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page