根据不同业务场景需要进行日期时间计算,例如国际化多时区,日期的计算等场景。我们就可以借助python的包进行计算,pandas、datetime、time。

Python时间计算

pandas

pd.date_range

Day

# 创建时间
pd.date_range(start='1/1/2018', end='1/08/2018')
# 起始时间向后顺延8D
pd.date_range(start='1/1/2018', periods=8)
# 结束时间向前顺延8D
pd.date_range(end='1/1/2018', periods=8)
# 起始结束不动,平均分
pd.date_range(start='2018-04-24', end='2018-04-27', periods=3)

Month

# 起始日期向后顺延5M
pd.date_range(start='1/1/2018', periods=5, freq='M')
# 起始日期向后顺延5M,跨度为3M
pd.date_range(start='1/1/2018', periods=5, freq='3M')

TimeZone

# 创建日本/东京时区时间
pd.date_range(start='1/1/2018', periods=5, tz='Asia/Tokyo')

pd.to_datetime

创建日期

pd.DataFrame({'year': [2015, 2016],
              'month': [2, 3],
              'day': [4, 5]})

时间戳转换日期

pd.to_datetime(1490195805, unit='s')
Timestamp('2017-03-22 15:16:45')

pd.to_datetime(1490195805433502912, unit='ns')
Timestamp('2017-03-22 15:16:45.433502912')

字符串转日期

pd.to_datetime(['2018-10-26 12:00', '2018-10-26 13:00:15'])

from datetime import datetime
pd.to_datetime(["2020-01-01 01:00 -01:00", datetime(2020, 1, 1, 3, 0)])

日期计算

from datetime import timezone, timedelta
pd.to_datetime(['2018-10-26 12:00', '2018-10-26 12:00 -0530',
               datetime(2020, 1, 1, 18),
               datetime(2020, 1, 1, 18,
               tzinfo=timezone(-timedelta(hours=1)))],
               utc=True)
               
DatetimeIndex(['2018-10-26 12:00:00+00:00', '2018-10-26 17:30:00+00:00',
               '2020-01-01 18:00:00+00:00', '2020-01-01 19:00:00+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)

pd.Timedelta

日期计算,年月同理,尽心加减运算

pd.Timedelta(1, "d")
pd.Timedelta(days=1)

Datatime

获取时间

import datetime
# 获取系统当前时间。
datetime.datetime.now()
# 获取系统今天时间。
datetime.datetime.today()
# 获取系统今天日期
datetime.date.today()

时间计算

detetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

"""
参数说明

①days:指定相差天数。可选,默认为0。

②seconds:指定相差秒数。可选,默认为0。

③microseconds:指定相差微秒数。可选,默认为0。

④milliseconds:指定相差毫秒数值。可选,默认为0。

⑤minutes:指定相差分钟数值。可选,默认为0。

⑥hours:指定相差小时数值。可选,默认为0。

⑦weeks:指定相差周数。可选,默认为0。
"""

字符串转日期,日期转字符串

# 字符串转日期
datetime.datetime.strptime("2020-01-01 18:00:00", "%Y-%m-%d %H:%M:%S")
# 日期转字符串
datetime.datetime.strftime(datetime.datetime(2020, 1, 1, 18, 0), "%Y-%m-%d %H:%M:%S")

国际化

import time
# 获取当前国际 UTC 时间
datetime.utcfromtimestamp(time.time())


def now_time_get_time_offset(tmp_time=time.time()):
        """
        通过传入时间获取与UTC时区偏移量 默认当前时间

        :param tmp_time: type(time) 当前时间戳 e.g. 1669690645.691196
        :return int
        """
        time_offset = (datetime.datetime.fromtimestamp(tmp_time) -
                       datetime.datetime.utcfromtimestamp(tmp_time)).total_seconds() / 60 / 60
        return int(time_offset)
        
        
# 通过key获取时区
from pytz import timezone
tz = timezone("Asia/Shanghai")

def time_zone_get_time_offset(time_zone="Asia/Shanghai"):
        """
        通过传入时区获取与UTC时区偏移量 默认系统时区

        :param time_zone: type(str) 时区 e.g. Asia/Shanghai
        :return int
        """
        tz = timezone(time_zone)
        res = datetime.datetime.now(tz).utcoffset().total_seconds() / 60 / 60
        return int(res)