Python日期和时间相关操作

376 查看

1. 先来看几个常用的

1.1 获取今天、昨天、明天的日期时间

from datetime import datetime, timedelta, date

'''今天'''
today1 = date.today()  # 精确到`天`
today2 = datetime.today()  # 精确到`微秒`
str(today1), str(today2)

# 结果:
# datetime.date(2015, 11, 20)
# datetime.datetime(2015, 11, 20, 16, 26, 21, 593990)
# ('2015-11-20', '2015-11-20 16:26:21.593990)


'''昨天'''
yesterday1 = date.today() + timedelta(days=-1)
yesterday2 = datetime.today() + timedelta(days=-1)
str(yesterday1), str(yesterday2)

# 结果:
# datetime.date(2015, 11, 19)
# datetime.datetime(2015, 11, 19, 16, 26, 21, 593990)
# ('2015-11-19', '2015-11-19 16:26:21.593990)


'''明天'''
tomorrow1 = date.today() + timedelta(days=1)
tomorrow2 = datetime.today() + timedelta(days=1)
str(tomorrow1), str(tomorrow2)

# 结果:
# datetime.date(2015, 11, 21)
# datetime.datetime(2015, 11, 21, 16, 26, 21, 593990)
# ('2015-11-21', '2015-11-21 16:26:21.593990)

那获取几小时,几分钟,甚至几秒钟前后的时间呢?该怎么获取?

看如下的代码:

from datetime import datetime, timedelta

# 获取两小时前的时间
date_time = datetime.today() + timedelta(hours=-2)

其实就是给 timedelta() 这个类传入的参数变一下就可以了

可传入的参数有 timedelta(weeks, days, hours, second, milliseconds, microseconds) 每个参数都是可选参数,默认值为0,参数值必须是这些(整数浮点数正数负数

分别表示:timedelta(周,日,时,分,秒,毫秒,微秒)。也只能传入这7个参数

说明:timedelta 这个对象其实是用来表示两个时间的间隔

上面我们都是使用 datetime.today() 加上 timedelta(),那如果是 datetime.today() 减去 timedelta() 这样呢? 其实得出结果就是相反而已,不明白可以动手试一下,对比一下 +- 之后的结果。

1.2 下面来说说获取N年前/后,N月前/后的技巧

因为 timedelta() 这个对象传入的参数最大日期时间单位是,最小的是 微秒
所以,关于 需要我们手动处理一下

import datetime
import calendar

def conver(value, years=0, months=0):
    if months:
        more_years, months = divmod(months, 12)
        years += more_years

        if not (1 <= months + value.month <= 12):
            more_years, months = divmod(months + value.month, 12)
            months -= value.month
            years += more_years

    if months or years:
        year = value.year + years
        month = value.month + months

        # 此月份的的天号不存在转换后的月份里,将引发一个 ValueError 异常
        # 比如,1月份有31天,2月份有29天,我需要1月31号的后一个月的日期,也就是2月31号,但是2月份没有31号
        # 所以会引发一个 ValueError 异常
        # 下面这个异常处理就是为了解决这个问题的
        try:
            value = value.replace(year=year, month=month)
        except ValueError:
            _, destination_days = calendar.monthrange(year, month)
            day = value.day - destination_days
            month += 1
            if month > 12:
                month = 1
                year += 1
            value = value.replace(year=year, month=month, day=day)

    return value

today = datetime.datetime.today()
print today  # 今天日期
print conver(today, months=1)  # 1月后
print conver(today, months=-1)  # 1月前
print conver(today, years=1)  # 1年后
# 结果
# datetime.datetime(2015, 11, 20, 16, 26, 21, 593990)
# datetime.datetime(2015, 12, 20, 16, 26, 21, 593990)
# datetime.datetime(2015, 10, 20, 16, 26, 21, 593990)
# datetime.datetime(2016, 11, 20, 16, 26, 21, 593990)

代码取自 when.py_add_time 函数部分代码

更新中...