1.日期字符串转换
#datetime
from datetime import datetime
#####日期字符串转换:
'''字符串转日期datetime.strptime(str,format),类方法'''
date_str = "2023-03-15"
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
'''日期转字符串time.strftime(format),实例方法'''
output = date_obj.strftime("%Y/%m/%d %A") # 输出:2023/03/15 Wednesday
print(output)
'''
代码 含义 示例
%Y 四位数年份 2023
%y 两位数年份 23
%m 补零月份(01-12) 07
%d 补零日期(01-31) 05
%H 24小时制小时 14
%M 分钟(00-59) 05
%A 星期全称(Locale) Wednesday
%a 星期缩写 Wed
'''
2.时间间隔利用:推算时间,计算时差
#####时间间隔计算:
from datetime import datetime, timedelta
# 计算日期差
date1 = datetime(2023, 1, 1)'''datetime(2023,1,1) 是一个创建日期对象的函数调用,类方法''
date2 = datetime(2023, 12, 31)
delta = date2 - date1
print(delta.days) '''# 输出:364 实例属性调用'''
# 日期推算
new_date = date1 + timedelta(days=100)
'''
#timedelta(days=100) 表示一个 100 天的时间间隔,当做数字用。类方法
#timedelta 还可以接受其他参数,
#如 seconds、microseconds、milliseconds、minutes、hours 和 weeks,用于表示更细粒度的时间差。
'''
print(new_date) # 2023-04-11 00:00:00
# 复杂时间计算
new_time = datetime(2023,7,20,14,30) + timedelta(hours=3, minutes=15)
print(new_time) # 2023-07-20 17:45:00
帮助记忆:timedelta,时间差,delta:
3.星期计算
#####星期计算
date = datetime(2023,7,20)
print(date.weekday()) # 3(星期四)
print(date.isoweekday()) # 4(星期四)
'''
#isoweekday”用于返回当前日期是星期几,返回值是整数,范围是1到7,其中1代表星期一,2代表星期二,一直到7代表星期日。实例方法
#weekday()0-6,周一至周六,实例方法
4.闰年判断
# 方法1:datetime库特性
def is_leap(year):
try:
datetime(year,2,29)#闰年才有2/29
return True
except ValueError:
return False
'''
#try:
#如果代码块中的语句正常执行那么程序会继续执行 “try:” 后面的代码;
#如果代码块中的语句引发了异常,程序会跳过 “try:” 块中剩余的代码,转而执行与之匹配的 “except:” 块中的代码
'''
# 方法2:计算逻辑
def is_leap(year):
return year%4==0 and (year%100!=0 or year%400==0)#闰年定义
5.时间戳处理
#####时间戳
# 日期转时间戳
ts = datetime(2023,3,15).timestamp() # 1678838400.0
'''“timestamp()”它的作用是将datetime对象转换为时间戳(timestamp)。实例方法
时间戳是指从1970年1月1日00:00:00 UTC(协调世界时)开始,经过的秒数(不考虑闰秒),它是一个浮点数。
'''
# 时间戳转日期
date_obj = datetime.fromtimestamp(1678838400)
'''fromtimestamp”这个方法的作用是将一个时间戳转换为一个 datetime 对象。实例方法
6.竞赛技巧:
'''1.处理多组日期输入,快速输入'''
n = int(input())
dates = [datetime.strptime(input().strip(), "%Y%m%d") for _ in range(n)]
'''2.避免闰年陷阱'''
def safe_date(year, month, day):
try:
return datetime(year, month, day)
except ValueError:
return None # 无效日期处理
'''3.性能优化'''
#预处理日期数据到字典加速查询
week_cache = {}
for y in range(2000,2024):
for m in range(1,13):
key = f"{y}-{m}"
week_cache[key] = datetime(y,m,1).isoweekday()
'''strip()部分
- 这是一个字符串方法。它的作用是移除字符串头尾指定的字符,默认情况下是移除字符串头尾的空白字符,包括空格、制表符(\t)、换行符(\n)等。例如,如果有一个字符串s=" hello world ",那么s.strip()的结果就是"hello world",去掉了字符串两端的空格。
所以“input().strip()”组合起来的作用就是获取用户输入的字符串,并且去除这个字符串两端的空白字符。
'''
7.练习题:
1)计算1901-1-1到2000-12-31之间的每个月的第一天是星期一的天数
2)计算2023-03-15到2024-02-10之间的天数
#1)
count = 0
for year in range(1901,2001):
for month in range(1,13):
if datetime(year, month, 1).weekday() == 0: # Monday=0
count +=1
print(count) # 正确答案:172
#2)
days = (datetime(2024,2,10) - datetime(2023,3,15)).days # 332天