【python中处理日期和时间二】扩展内容datetime模块-pytz模块-dateutil模块

扩展内容:日期和时间

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大山很山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值