Python中日期模块的多元化应用

发表于:2023-3-31 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:任沫    来源:掘金

#
Python
  本文主要总结几个Python中日期相关的使用,主要使用的是datetime模块。
  datetime模块中的date类包含年月日、time类包含时分秒以及微秒和时区,datetime类是日期和时间的组合包含年月日和时分秒以及微秒和时区。
  字符串/日期
  日期转字符串使用strftime,字符串转日期使用strptime。两者的区别如下:
  日期转字符串
  使用strftime(format),要注意这是实例的方法。
  1.date类实例转化为字符串:
from datetime import date

today = date.today()
today_str = today.strftime('%Y-%m-%d')
print(today_str) # 2021-06-14
  用到的代表年月日等的%Y等符号的含义。
  2.datetime类实例转化为字符串:
from datetime import datetime

dt = datetime(2021, 6, 14, 15, 2, 3)
dt_str = dt.strftime('%Y/%m/%d %H:%M:%S')
print(dt_str) # 2021/06/14 15:02:03
  构造器datetime.datatime,创建一个datetime实例。用法:
datetime.datetime(year, month, day, hour=0,minute=0,second=0, microsecond=0,tzinfo=None, *, fold=0)
  3.time类实例转化为字符串
from datetime import time

t = time(15, 3, 0)
t_str = t.strftime('%H:%M:%S')
print(t_str) # 15:03:00
  字符串转日期
  使用strptime(date_string, format),要注意这是类的方法。
from datetime import datetime

dt = datetime.strptime('2021/06/14 15:05:06', '%Y/%m/%d %H:%M:%S')
print(dt, type(dt)) # 2021-06-14 15:05:06 <class 'datetime.datetime'>
  时间间隔计算
  使用dateutil包能非常方便地进行日期相关的处理,当然也可以使用python自带的模块实现。
  根据时间间隔得到日期时间
  得到距离当前时间n秒/分钟/小时/天/周/月/年的开始时间。
  方法一:使用Python自带的模块
  主要datetime模块的timedelta方法。timedelta代表的是一个时间间隔,是两个日期或者时间的差。用法:
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
  实现代码:
import calendar
from datetime import datetime, timedelta

def get_start_time(time_number, time_unit):
    '''
    得到距离当前时间time_number秒/分钟/小时/天/周/月/年的时间
    '''
    if type(time_number) != int or type(time_unit) != str:
        raise Exception('传入的time_number需为整数类型,time_unit需为字符串类型')
    now = datetime.now()
    unit_list = ['seconds', 'minutes', 'hours', 'days', 'weeks']
    delta_params = None
    if time_unit in unit_list:
        delta_params = {
            time_unit: time_number
        }
        delta = timedelta(**delta_params)
        start_time = now - delta
        return start_time
    if time_unit == 'months':
        now_year = now.year
        now_month = now.month
        now_day = now.day
        start_year = now_year
        start_month = now_month - time_number
        start_day = now_day
        # 前time_number个月跨年了,比如当前是2021年3月,要取5月前的日期,那就是2020年10月
        if start_month <= 0:
            months_interval = abs(start_month)
            years_interval = months_interval // 12
            start_year = now_year - years_interval - 1
            start_month = 12 - months_interval % 12

        weekday, month_days = calendar.monthrange(year=start_year, month=start_month)
        # 前time_number个月没有当前日期,比如今天是3月31号,2月只有28号,那么取2月最后的一天28号
        if now_day > month_days:
            start_day = month_days
        start_time = now.replace(year=start_year, month=start_month, day=start_day)
        return start_time
    
    if time_unit == 'years':
        now_year = now.year
        now_month = now.month
        now_day = now.day
        start_year = now_year - time_number
        start_day = now_day
        weekday, month_days = calendar.monthrange(year=start_year, month=now_month)
        # 前time_number年对应的月没有当前日期,比如今天是2月29号,前1年的2月只有2月28号,那么取28号
        if now_day > month_days:
            start_day = month_days
        start_time = now.replace(year=start_year, month=now_month, day=start_day)
        return start_time

x = get_start_time(1, 'years')
print(x)
  1.因为timedelta方法只支持到周,所以关于月和年的计算需要自行处理,需要考虑跨年和日期的特殊情况。
  2.date类实例和datetime类实例都有replace方法,它们的用法分别如下:
  (1)返回一个date实例:
date.replace(year=self.year, month=self.month, day=self.day)
  比如将今天的年份换成2020年,可以使用:
from datetime import date

today = date.today()
n = today.replace(year=2020)
print(n) # 2020-06-14
  (2)返回一个datetime实例:
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0)
  比如将今天的月份换成5月份,可以使用:
from datetime import datetime

now = datetime.now()
m = now.replace(month=5)
print(m) # 2021-05-14 16:27:44.384520
  3.calendar模块的calendar.monthrange(year, month)方法返回指定年月的第一天的工作日和该月的总天数。
  方法二:使用dateutil包
  安装:pip install python-dateutil。
  使用relativedelta方法,用法:
relativedelta.relativedelta(years, months, weeks, days, hours, minutes, seconds, microseconds)
  实现代码:
from dateutil.relativedelta import relativedelta

def get_start_time_v1(time_number, time_unit):
    unit_list = ['years', 'months', 'weeks', 'days', 'hours', 'minutes', 'seconds']
    if type(time_number) != int:
        raise Exception('传入的time_number类型需为整数')
    if time_unit not in unit_list:
        raise Exception('传入的单位time_unit不正确')
    now = datetime.now()
    delta_params = {
        time_unit: -time_number
    }
    start_time = now + relativedelta(**delta_params)
    return start_time

# 测试
y = get_start_time_v1(1, 'years')
print(y)
  得到2个月前的时间间隔,使用:
relativedelta.relativedelta(months=-2)
  得到2个月零2天的时间间隔,使用:
relativedelta.relativedelta(months=-2, days=-2)
  根据日期时间得到时间间隔
  计算两个时间之间的秒数。
def get_time_interval(start_time, end_time):
    start_time = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
    end_time = datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
    if type(start_time) != datetime or type(end_time) != datetime:
        raise Exception('传入的参数格式不正确')
    if end_time < start_time:
        raise Exception('结束时间小于开始时间')
    interval = end_time - start_time
    return interval.seconds

# 测试
z = get_time_interval('2021-06-14 14:55:00', '2021-06-14 14:55:02')
print(z) # 2 秒
  timedelta实例的属性:
  如果不是计算两个时间的秒数,想要计算两个日期之间的年的差异或者月的差异,使用relativedelta方法比较方便:
def get_time_interval_v1(start_time, end_time):
    start_time = datetime.strptime(start_time, '%Y-%m-%d %H:%M:%S')
    end_time = datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
    if type(start_time) != datetime or type(end_time) != datetime:
        raise Exception('传入的参数格式不正确')
    if end_time < start_time:
        raise Exception('结束时间小于开始时间')
    interval = relativedelta(end_time, start_time)
    return interval.years * 12 + interval.months
    
o = get_time_interval_v1('2021-06-14 14:55:00', '2022-07-14 14:55:02')
print(o) # 13 月
  获取时间戳
>>> from datetime import datetime
>>> now = datetime.now()
>>> timestamp = datetime.timestamp(now)
>>> timestamp
1654677564.575214
>>> int(timestamp)
1654677564
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号