数字日期和时间05-最后一个星期五日期 / 当前月份的日期范围 / 字符串转换为日期 / 时区的日期操作

最后一个星期五日期

  • 使用 dateutil 模块中的 relativedelta()
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *

# 现在的日期与时间
d = datetime.now()
print(d)   # 2018-09-09 17:13:35.301246

# 下周五的日期
print(d + relativedelta(weekday=FR))  # 2018-09-14 17:15:01.

# 最后一个星期五的日期
print(d + relativedelta(weekday=FR(-1))) #2018-09-07 17:17:40.549931
  • 使用 datetime 模块
    算法原理:先将开始日期和目标日期映射到星期数组的位置上 (星期一索引为 0),然后通过模运算计算出目标日期要经过多少天才能到达开始日期。然后用开始日期减去那个时间差即得到结果日期。
from datetime import datetime, timedelta

weekdays = ['Monday', 'Tuesday', 'Wednesday',
            'Thursday','Friday', 'Saturday', 'Sunday']

def get_previous_byday(dayname, start_date=None):
    if start_date is None:
        start_date = datetime.today()
    day_num = start_date.weekday()
    day_num_target = weekdays.index(dayname)
    days_ago = (7 + day_num - day_num_target) % 7
    if days_ago == 0:
        days_ago = 7
    target_date = start_date - timedelta(days=days_ago)
    return target_date

print(get_previous_byday('Friday'))  # 2018-09-07 17:17:40.549931

计算当前月份的日期范围

from datetime import datetime, date, timedelta
import calendar

#定义一个函数,返回开始日期和结束日期
def totalDays(start_date=None):
    #开始日期,如果没有开始日期则定义本月首日
    if start_date is None:
        start_date = date.today().replace(day=1)
        print('开始日期是:',start_date)   # 2018-09-09

    # 本月1号的星期索引和本月天数
    index, days_in_month = calendar.monthrange(start_date.year, start_date.month)
    # print(index, days_in_month)           # 5 30

    #一个月后的日期
    end_date = start_date + timedelta(days=days_in_month)
    print('一个月后的日期是:',end_date)   # 2018-10-01

    return (start_date, end_date)



#定义一个时间段=1天
a_day = timedelta(days=1)

#使用函数,得到开始日跟结束日
first_day, last_day = totalDays()

# 循环判断
#如是开始日< 结束日,打印开始日,并让开始日+ 1天
while first_day < last_day:
    print(first_day)
    first_day += a_day
'''
    2018-09-01
    2018-09-02
    2018-09-03
    2018-09-04
    ...
    2018-09-30
'''

tips:
replace() 方法一个好处就是它会创建和你开始传入对象类型相同的对象。所以,如果输入参是一个 date 实例,那么结果也是一个 date 实例。同样的,如果输入是一个 datetime实例,那么你得到的就是一个 datetime 实例

  • 使用生成器
# 定义一个函数,获得生成器列表
def date_range(start, stop, step):
    while start < stop:
        yield start
        start += step

from datetime import datetime, timedelta

# 遍历列表
for d in date_range(datetime(2018,9,1),datetime(2018,10,1),timedelta(days=1)):
    print(d)

字符串转换为日期

  • 使用 datetime.strptime()
from datetime import datetime

# 时间字符串
mystring = '2018-09-01'

# 将时间字符串转化为时间,并定义格式
a = datetime.strptime(mystring, '%Y-%m-%d')
print(a)         # 2018-09-01 00:00:00

# 现在时间
b = datetime.now()
print(b)         # 2018-09-10 01:41:55.979311

#执行时间操作
c = b - a
print(c)         # 9 days, 1:38:52.124994

strptime() 的性能要比你想象中的差很多,因为它是使用纯 Python 实现,并且必须处理所有的系统本地设置。如果你要在代码中需要解析大量的日期并且已经知道了日期字符串的确切格式,可以自己实现一套解析方案来获取更好的性能。比如:

from datetime import datetime

#定义一个方法,返回日期整数
def turn_to_time(s):
    #把字符串炸开
    year_s, mon_s, day_s = s.split('-')
    #返回日期
    return datetime(int(year_s), int(mon_s), int(day_s))

mystring = '2018-09-01'
print(turn_to_time(mystring))  # 2018-09-01 00:00:00

(另)时间转字符串

时间也可以转化为自符串,并且可以按自定义的格式去处理

  • 使用 datetime.strftime()
from datetime import datetime

# 现在时间
b = datetime.now()
print(b)      # 2018-09-10 01:41:55.979311

# 时间转为字符串,并设定想要的时间格式
B = datetime.strftime(b, '%A %B %d, %Y')
print(B)      # Monday September 10, 2018

配合时区的日期操作

对几乎所有涉及到时区的问题,你都应该使用 pytz 模块。这个包提供了 Olson 时区数据库,它是时区信息的事实上的标准,pytz 模块一个主要用途是将 datetime 库创建的简单日期对象本地化

例:你有一个安排在 2012 年 12 月 21 日早上 9:30 的电话会议,地点在芝加哥。而你的朋友在印度的班加罗尔,那么他应该在当地时间几点参加这个会议呢?

from datetime import datetime
from pytz import timezone

#现在时间
d = datetime(2018, 12, 21, 9, 30, 0)
print(d)   # 2018-12-21 09:30:00

#芝加哥的日期
central = timezone('US/Central')
loc_d = central.localize(d)
print(loc_d)   # 2018-12-21 09:30:00-06:00

#转换到班加罗尔时间
bang_d = loc_d.astimezone(timezone('Asia/Kolkata'))
print(bang_d)  #2 018-12-21 21:00:00+05:30

UTC 时间

处理本地化日期的通常的策略先将所有日期转换为 UTC 时间,并用它来执行所有的中间存储和操作

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/82560990
今日推荐