扩展内容:日期和时间
datetime模块;pytz模块;dateutil模块
一、 datetime模块
查看datetime模块函数:
>>> import datetime
>>> dir(datetime)
['MAXYEAR', 'MINYEAR', 'UTC', '__all__', '__builtins__', '__cached__', '__doc__',
'__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime',
'datetime_CAPI', 'time', 'timedelta', 'timezone', 'tzinfo']
>>>
1、基础应用示例:
import datetime #引入datetime模块
import time #引入datetime模块
ticks_data = time.time() #当前时间戳
print("------创建指定时间-------")
tim = datetime.time (18,30,00)
print(tim)
print(tim.isoformat()) #返回型如"HH:MM:SS"格式的字符串表示
print(tim.strftime("%H-%M-%S")) #自定义格式
print(datetime.datetime(2024,3,15,18,00,00))
print("------获得当前时间-------")
print("1-now()函数:",datetime.datetime.now())
print("2-today()函数:",datetime.datetime.today())
print("------时间格式化-------")
tim1=datetime.datetime.now()
print("当前日期和时间:",tim1.strftime("%Y-%m-%d %H:%M:%S"))
print("当前日期:",tim1.strftime("%Y-%m-%d "))
print("时间:",tim1.strftime("%H:%M:%S"))
print("年",tim1.year,"月",tim1.month,"日",tim1.day,"时",tim1.hour,"分",tim1.minute,"秒",tim1.second)
运行结果如下:
2、计算从指定年月日,或到特定日期多少天
import datetime
def birthday(year,month,day):
bir = datetime.datetime(year,month,day,0,0,0)
now = datetime.datetime.now()
day = (now - bir).days
return day
print(birthday(1990,9,26))
运行结果:
3、给定任意日期,输出该日期对应的 上周/本周/下周 周一的日期
import datetime
def last_monday(date_str):
ji = datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime("%w")
ji = eval(ji)
date_str = datetime.datetime.strptime(date_str, "%Y-%m-%d")
if ji == 0:
delta = datetime.timedelta(days=6)
last = date_str - delta
else:
delta = datetime.timedelta(days=ji+6)
last = date_str - delta
last = last.strftime("%Y-%m-%d")
return last
def this_monday(date_str):
ji = datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime("%w")
ji = eval(ji)
date_str = datetime.datetime.strptime(date_str, "%Y-%m-%d")
if ji == 0:
delta = datetime.timedelta(days=1)
this = date_str + delta
else:
delta = datetime.timedelta(days=ji-1)
this = date_str - delta
this = this.strftime("%Y-%m-%d")
return this
def next_monday(date_str):
ji = datetime.datetime.strptime(date_str, "%Y-%m-%d").strftime("%w")
ji = eval(ji)
date_str = datetime.datetime.strptime(date_str, "%Y-%m-%d")
if ji == 0:
delta = datetime.timedelta(days=8)
ne = date_str + delta
else:
delta = datetime.timedelta(days=8-ji)
ne = date_str + delta
ne = ne.strftime("%Y-%m-%d")
return ne
n = input("请输入日期:")
print('输入日期:', n)
print('上周一:', last_monday(n))
print('本周一:', this_monday(n))
print('下周一:', next_monday(n))
运行结果:
二、pytz模块
pytz使用方法:
1、使用pip下载其依赖库,或如上下载方式
pip install pytz
2、使用时,需要用import导入。
import pytz
1 pytz说明
由于pytz模块属于第三方库,所以在使用前需要使用pip进行下载其依赖库。
pip install pytz。(添加pytz库详细如下图)
(1)pytz 模块依赖Olson tz数据库导入,支持直接使用时区名进行时间计算
(2)pytz 模块涉及时区,因此其也指定tzinfo信息(详情可datetime.tzinfo)
(3)pytz 模块常与datetime模块结合一起使用,返回具体的时间名
(4)pytz 模块可以解决夏令时结束时不明确的问题
注意
pytz 模块支持大多数的时区计算,使用IANA的数据接口,CLDR(Unicode 语言环境)项目提供翻译,本地还需要按照依赖是时区映射表tzdata数据库(pip install tzdata)添加方式同添加pytz库。
添加pytz库,方式如下:
国家/城市代码映射表,pytz库中存储在_CountryTimezoneDict()字典中。
可以通过 pytz.country_timezones常量来获取code,timezon。(暂未用到的)
2 pytz使用示例
2.1 基础使用
import datetime
import pytz
""""""
print("------创建本地化时间-------")
tz = pytz.timezone('US/Eastern')
local_time =tz.localize(datetime.datetime(2022, 6, 13,23, 0, 0))
print(local_time)
ast = local_time.astimezone(tz)
print(ast)
print("------pytz提供了全部的timezone信息-------")
print(len(pytz.all_timezones))
print(len(pytz.common_timezones))
print("------获取某个国家的时区-------")
print(pytz.country_timezones( 'cn'))
print("------中国一个有两个时区,一个为上海,一个为乌鲁木齐-------")
#上海是东八区,而乌鲁木齐是东六区
from datetime import datetime
print(pytz.country_timezones( 'cn'))
tz1 = pytz.timezone(pytz.country_timezones( 'cn')[ 0])
print(tz1)
print(datetime.now(tz1))
tz2 = pytz.timezone(pytz.country_timezones( 'cn')[ 1])
print(tz2)
print(datetime.now(tz2))
print("------使用astimezone可以进行时区与时区之间的转换-------")
utc = pytz.utc
beijing_time = pytz.timezone( 'Asia/Shanghai')
japan_time = pytz.timezone( 'Asia/Tokyo')
now = datetime.now(beijing_time)
print( "Beijing Time:",now)
print( "UTC:",now.astimezone(utc))
print( "JAPAN TIME:",now.astimezone(japan_time))
运行结果如下:
2.2 时区查询和日期计算
import pytz
from datetime import datetime
print("------pytz 时区查询-------")
"""
输入一个城市:city,如"Shanghai" or "Simferopol"
输出城市的时区偏离量:如+3
"""
def timezon_city_gmt(city):
timezons = sum(list(pytz.country_timezones.values()), [])#调用pytz.country_timezones.values()获取到所有的时区timezones
cityList = [city.split("/")[1] for city in timezons] #使用split()将时区的城市名进行分割形成列表city_list
city_index = cityList.index(city) #先在city_list.index[city]找到City_index
tz = pytz.timezone(timezons[city_index]) #然后根据City_index在timezones找到时区tzname
gmt = "GMT" + str(datetime.now().astimezone(tz))[-6:] #pytz.timezone(tzname)格式化,算出标准时间
return gmt
print(timezon_city_gmt("Shanghai"))
print(timezon_city_gmt("Simferopol"))
print(timezon_city_gmt("Moscow"))
print("------pytz 日期计算[根据当地时间,算出对方所在时区的当地时间]-------")
def update_datetime_tz(olddatetime, city, formate):
timezons = sum(list(pytz.country_timezones.values()), [])
cityList = [city.split("/")[1] for city in timezons]
city_index = cityList.index(city)
tz = pytz.timezone(timezons[city_index])
datetime_type = datetime.strptime(olddatetime, formate) #datetime.strptime()将时间字符串转化成datetime对象
newdatetime = datetime_type.astimezone(tz)
return newdatetime.strftime(str(formate))
print(update_datetime_tz("2024-03-22 13:45:03", "Moscow", "%Y-%m-%d %H:%M:%S"))
print(update_datetime_tz("2024-03-22 13:45:03", "Shanghai", "%Y-%m-%d %H:%M:%S"))
运行结果如下:
三、dateutil模块
dateutil 是 Python 的一个第三方库,主要用于解析日期和时间的字符串,以及进行日期和时间的运算。这个库提供了很多方便的功能,特别是对于那些需要处理复杂日期和时间的场景。
安装
可以使用pip来安装detautil
pip install python-dateutil
或在setting下进行处理
主要功能
from dateutil import parser
print("------dateutil 解析日期和时间字符串-------")
date_string = "March 31, 2023"
date_object = parser.parse(date_string) #dateutil.parser 模块可以解析多种格式的日期和时间字符串。
print(date_object) # 输出:2023-03-31 00:00:00
print("------dateutil 处理相对日期和时间-------")
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
one_year_later = now + relativedelta(years=2)#dateutil.relativedelta 模块可以方便地处理相对日期和时间。
print(one_year_later) # 输出2年后的日期和时间
print("------parser.parse 解析时间到datetime格式,支持大部分时间字符串。-------")
#没指定时间默认是0点,没指定日期默认是今天,没指定年份默认是今年。
from dateutil import parser
print(parser.parse( "8th March,2024"))
print(parser.parse( "8 March,2004"))
print(parser.parse( "20240312"))
print(parser.parse( "08,15"))
print(parser.parse( "14:00:00"))
print(parser.parse( "Wed, Nov 12"))
运行结果如下:
------dateutil 解析日期和时间字符串-------
2023-03-31 00:00:00
------dateutil 处理相对日期和时间-------
2026-03-22 14:06:59.230101
------parser.parse 解析时间到datetime格式,支持大部分时间字符串。-------
2024-03-08 00:00:00
2004-03-08 00:00:00
2024-03-12 00:00:00
2024-03-08 00:00:00
2024-03-22 14:00:00
2024-11-12 00:00:00
注意事项:
尽管 dateutil 提供了很多方便的功能,但在处理日期和时间时,
最好还是尽可能地使用 Python 内置的 datetime 模块。
datetime 模块提供了很多基本功能,并且与 Python 的其他部分集成得很好。
当你需要处理更复杂的场景时,再考虑使用 dateutil 或其他第三方库。
更多参考:dateutil