Python标准库datetime库timezone类详解+总结(6/6)

timezone对象

用于创建表示特定时区的对象。这些对象可以用于将datetime对象转换为本地时间,或将本地时间转换为UTC时间。

timezone 类是 tzinfo 的子类,它的每个实例都代表一个以与 UTC 的固定时差来定义的时区。

此类的对象不可被用于代表某些特殊地点的时区信息,这些地点在一年的不同日期会使用不同的时差,或是在历史上对民用时间进行过调整。

构造方法

1、datetime.timezone(offset, name=None)

用于创建时区对象。

这个构造函数允许你定义一个特定的时区,其中offset参数表示与协调世界时(UTC)的偏移量,而name参数可选,用于为时区指定一个名称。

offset 参数必须指定为一个 timedelta 对象,表示本地时间与 UTC 的时差。 它必须严格限制于 -timedelta(hours=24) 和 timedelta(hours=24) 之间,否则会引发 ValueError。

name 参数是可选的。 如果指定则必须为一个字符串,它将被用作 datetime.tzname() 方法的返回值。

3.2 新版功能.

在 3.7 版更改: UTC 时差不再限制为一个整数分钟值。

例:

from datetime import datetime, timezone, timedelta

# 创建一个时区对象,表示UTC+8

custom_timezone = timezone(timedelta(hours=8), name='Asia/Shanghai')

# 创建一个带有时区信息的日期时间对象

dt_with_custom_timezone = datetime(2023, 1, 1, 12, 0, 0, tzinfo=custom_timezone)

# 打印结果

print(f"日期时间对象 {dt_with_custom_timezone} 所处时区:{custom_timezone}")

输出:日期时间对象 2023-01-01 12:00:00+08:00 所处时区:Asia/Shanghai

实例方法

1、timezone.utcoffset()

用于获取日期时间对象dt所处时区偏移的方法。这个方法返回一个时间差(timedelta),表示当前时区相对于协调世界时(UTC)的偏移量。

返回当 timezone 实例被构造时指定的固定值。

dt 参数会被忽略。 返回值是一个 timedelta 实例,其值等于本地时间与 UTC 之间的时差。

在 3.7 版更改: UTC 时差不再限制为一个整数分钟值。

例:

from datetime import datetime, timezone, timedelta

# 创建一个时区对象

beijing_tz = timezone(timedelta(hours=8),"Asia/beijing")

# 创建一个带有时区信息的日期时间对象

now = datetime(2022,1,1,13,33,33,tzinfo=beijing_tz)

# 打印时区偏移

print("now对象时区偏移是:",now.utcoffset(),"所处时区是:",beijing_tz)

输出:now对象时区偏移是: 8:00:00 所处时区是: Asia/beijing

2、timezone.tzname(dt)

用于获取指定日期时间对象dt的时区名称的方法。

这个方法返回 一个包含两个字符串的元组,分别表示日期时间对象所在时区的标准时区名称和夏令时时区名称。

返回当 timezone 实例被构造时指定的固定值。

如果没有在构造器中提供 name,则 tzname(dt) 所返回的名称将根据 offset 值按以下规则生成。 如果 offset 为 timedelta(0),则名称为“UTC”,否则为字符串 UTC±HH:MM,其中 ± 为 offset 的正负符号,HH 和 MM 分别为表示 offset.hours 和 offset.minutes 的两个数码。

在 3.6 版更改: 由 offset=timedelta(0) 生成的名称现在是简单的 'UTC',而不是 'UTC+00:00'。

例:

from datetime import datetime, timezone, timedelta

# 创建一个带有时区信息的日期时间对象

dt_with_timezone = datetime(2023, 1, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=8), name='Asia/Shanghai'))

# 使用 tzname 方法获取时区名称

timezone_names = dt_with_timezone.tzname()

# 打印结果

print(f"日期时间对象 {dt_with_timezone} 所在时区的标准时区名称:{timezone_names[0]}")

print(f"日期时间对象 {dt_with_timezone} 所在时区的夏令时时区名称:{timezone_names[1]}")

输出

日期时间对象 2023-01-01 12:00:00+08:00 所在时区的标准时区名称:A

日期时间对象 2023-01-01 12:00:00+08:00 所在时区的夏令时时区名称:s

3、timezone.dst(dt)

用于获取指定日期时间对象dt所在时区的夏刢地(DST)偏移的方法。

夏令时是一种时间调整机制,通常在夏季期间将时钟向前调整一小时,以更好地利用日光,从而延长白天的时间。

这个方法返回一个timedelta对象,表示夏令时的偏移量。如果指定的日期时间对象dt所在的时区不使用夏令时,返回 的偏移量将为零。

总是返回 None。

例:

from datetime import datetime, timezone, timedelta

# 创建一个带有时区信息的日期时间对象,表示UTC-5时区(美国东部标准时间,EST)

dt_with_dst = datetime(2023, 6, 1, 12, 0, 0, tzinfo=timezone(timedelta(hours=-5), name='EST'))

# 使用 dst 方法获取夏令时偏移

dst_offset = dt_with_dst.dst()

# 打印结果

print(f"日期时间对象 {dt_with_dst} 所在时区的夏令时偏移:{dst_offset}")

输出

日期时间对象 2023-06-01 12:00:00-05:00 所在时区的夏令时偏移:None

4、timezone.fromutc(dt)

用于将协调世界时(UTC)的日期时间对象dt调整为指定时区的本地时间。

具体而言,fromutc方法会接受一个UTC时间戳dt,然后使用时区信息将其转换为本地时间。这个方法是由时区对象调用的,因此它考虑了该时区的所有规则,包括夏刢地和其他调整。

返回 dt + offset。 dt 参数必须为一个感知型 datetime 实例,其中 tzinfo 值设为 self。

类属性:

timezone.utc¶UTC 时区,timezone(timedelta(0))。

例:

from datetime import datetime, timezone, timedelta

# 创建一个时区对象,表示UTC+8时区(亚洲/上海)

custom_timezone = timezone(timedelta(hours=8), name='Asia/Shanghai')

# 创建一个带有时区信息的日期时间对象,表示UTC时间

dt_utc = datetime(2023, 6, 1, 12, 0, 0, tzinfo=custom_timezone)

# 使用 fromutc 方法将UTC时间转换为本地时间

dt_local = custom_timezone.fromutc(dt_utc)

# 打印结果

print(f"UTC时间 {dt_utc} 被转换为本地时间 {dt_local}")

输出:

UTC时间 2023-06-01 12:00:00+08:00 被转换为本地时间 2023-06-01 20:00:00+08:00

笔记 :如果仅处理国内时间,基本用不上timezone这个类,了解下即可。

strftime() 和 strptime() 的行为

date, datetime 和 time 对象都支持 strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。

相反地,datetime.strptime() 类会根据表示日期和时间的字符串和相应的格式字符串来创建一个 datetime 对象。

下表提供了 strftime() 与 strptime() 的高层级比较:

strftime

strptime

用法

根据给定的格式将对象转换为字符串

将字符串解析为给定相应格式的 datetime 对象

方法类型

实例方法

类方法

方法

datedatetimetime

datetime

签名

strftime(format)

strptime(date_string, format)

strftime() 和 strptime() Format Codes

以下列表显示了 1989 版 C 标准所要求的全部格式代码,它们在带有标准 C 实现的所有平台上均可用。

指令

含意

示例

备注

%a

当地工作日的缩写。

Sun, Mon, ..., Sat (en_US);

So, Mo, ..., Sa (de_DE)

(1)

%A

本地化的星期中每日的完整名称。

Sunday, Monday, ..., Saturday (en_US);

Sonntag, Montag, ..., Samstag (de_DE)

(1)

%w

以十进制数显示的工作日,其中0表示星期日,6表示星期六。

0, 1, ..., 6

%d

补零后,以十进制数显示的月份中的一天。

01, 02, ..., 31

(9)

%b

当地月份的缩写。

Jan, Feb, ..., Dec (en_US);

Jan, Feb, ..., Dez (de_DE)

(1)

%B

本地化的月份全名。

January, February, ..., December (en_US);

Januar, Februar, ..., Dezember (de_DE)

(1)

%m

补零后,以十进制数显示的月份。

01, 02, ..., 12

(9)

%y

补零后,以十进制数表示的,不带世纪的年份。

00, 01, ..., 99

(9)

%Y

十进制数表示的带世纪的年份。

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(2)

%H

以补零后的十进制数表示的小时(24 小时制)。

00, 01, ..., 23

(9)

%I

以补零后的十进制数表示的小时(12 小时制)。

01, 02, ..., 12

(9)

%p

本地化的 AM 或 PM 。

AM, PM (en_US);

am, pm (de_DE)

(1), (3)

%M

补零后,以十进制数显示的分钟。

00, 01, ..., 59

(9)

%S

补零后,以十进制数显示的秒。

00, 01, ..., 59

(4), (9)

%f

微秒作为一个十进制数,零填充到 6 位。

000000, 000001, ..., 999999

(5)

%z

UTC 偏移量,格式为 ±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串)。

(空), +0000, -0400, +1030, +063415, -030712.345216

(6)

%Z

时区名称(如果对象为简单型则为空字符串)。

(空), UTC, GMT

(6)

%j

以补零后的十进制数表示的一年中的日序号。

001, 002, ..., 366

(9)

%U

以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。 在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周。

00, 01, ..., 53

(7), (9)

%W

以补零后的十进制数表示的一年中的周序号(星期一作为每周的第一天)。 在新的一年中第一个星期一之前的所有日子都被视为是在第 0 周。

00, 01, ..., 53

(7), (9)

%c

本地化的适当日期和时间表示。

Tue Aug 16 21:30:00 1988 (en_US);

Di 16 Aug 21:30:00 1988 (de_DE)

(1)

%x

本地化的适当日期表示。

08/16/88 (None);

08/16/1988 (en_US);

16.08.1988 (de_DE)

(1)

%X

本地化的适当时间表示。

21:30:00 (en_US);

21:30:00 (de_DE)

(1)

%%

字面的 '%' 字符。

%

为了方便起见,还包括了C89标准不需要的其他一些指令。这些参数都对应于ISO 8601日期值。

指令

含意

示例

备注

%G

带有世纪的 ISO 8601 年份,表示包含大部分 ISO 星期 (%V) 的年份。

0001, 0002, ..., 2013, 2014, ..., 9998, 9999

(8)

%u

以十进制数显示的 ISO 8601 星期中的日序号,其中 1 表示星期一。

1, 2, ..., 7

%V

以十进制数显示的 ISO 8601 星期,以星期一作为每周的第一天。 第 01 周为包含 1 月 4 日的星期。

01, 02, ..., 53

(8), (9)

%:z

±HH:MM[:SS[.ffffff]] 形式的 UTC 偏移量(如果是简单型对象则为空字符串)。

(空), +00:00, -04:00, +10:30, +06:34:15, -03:07:12.345216

(6)

这些代码可能不是在所有平台上都可与 strftime() 方法配合使用。 ISO 8601 年份和 ISO 8601 星期指令并不能与上面的年份和星期序号指令相互替代。 调用 strptime() 时传入不完整或有歧义的 ISO 8601 指令将引发 ValueError

对完整格式代码集的支持在不同平台上有所差异,因为 Python 要调用所在平台的 C 库的 strftime() 函数,而不同平台的差异是很常见的。 要查看你所用平台所支持的完整格式代码集,请参阅 strftime(3) 文档。不同的平台在处理不支持的格式指定符方面也有差异。

3.6 新版功能: 增加了 %G%u 和 %V

3.12 新版功能: 增加了 %:z

技术细节

总体而言,d.strftime(fmt) 类似于 time 模块的 time.strftime(fmt, d.timetuple()),但是并非所有对象都支持 timetuple() 方法。

对于 datetime.strptime() 类方法,默认值为 1900-01-01T00:00:00.000: 任何未在格式字符串中指定的部分都将从默认值中提取。

使用 datetime.strptime(date_string, format) 等价于:

datetime(*(time.strptime(date_string, format)[0:6]))

除非格式中包含秒以下的部分或时区差值信息,它们在 datetime.strptime 中受支持但会被 time.strptime 所丢弃。

对于 time 对象,年、月、日的格式代码不应被使用,因为 time 对象没有这些值。 如果它们被使用,则年份将被替换为 1900,而月和日将被替换为 1。

对于 date 对象,时、分、秒和微秒的格式代码不应被使用,因为 date 对象没有这些值。 如果它们被使用,则它们都将被替换为 0。

出于相同的原因,对于包含当前区域设置字符集所无法表示的 Unicode 码位的格式字符串的处理方式也取决于具体平台。 在某些平台上这样的码位会不加修改地原样输出,而在其他平台上 strftime 则可能引发 UnicodeError 或只返回一个空字符串。

注释:

1、因为该格式依赖于当前语言区域,所以在假定输出值时应当仔细考虑。 字段顺序可能会有变化(例如 "month/day/year" 和 "day/month/year"),并且输出还可能包含非 ASCII 字符。

2、strptime() 方法能够解析整个 [1, 9999] 范围内的年份,但 < 1000 的年份必须加零填充为 4 位数字宽度。

在 3.2 版更改: 在之前的版本中,strftime() 方法只限于 >= 1900 的年份。

在 3.3 版更改: 在版本3.2中,strftime() 方法只限于 years >= 1000。

3、当与 strptime() 方法一起使用时,如果使用 %I 指令来解析小时,%p 指令只影响输出小时字段。

4、与 time 模块不同的是, datetime 模块不支持闰秒。

5、当与 strptime() 方法一起使用时,%f 指令可接受一至六个数码及左边的零填充。 %f 是对 C 标准中格式字符集的扩展(但单独在 datetime 对象中实现,因此它总是可用)。

6、对于简单型对象,%z, %:z 和 %Z 格式代码会被替换为空字符串。

对于一个感知型对象而言:

%z

utcoffset() 会被转换为 ±HHMM[SS[.ffffff]] 形式的字符串,其中 HH 为给出 UTC 时差的小时部分的 2 位数码字符串,MM 为给出 UTC 时差的分钟部分的 2 位数码字符串,SS 为给出 UTC 时差的秒部分的 2 位数码字符串,而 ffffff 为给出 UTC 时差的微秒部分的 6 位数码字符串。 当时差为整数秒时 ffffff 部分将被省略,而当时差为整数分钟时 ffffff 和 SS 部分都将被省略。 例如,如果 utcoffset() 返回 timedelta(hours=-3, minutes=-30),则 %z 会被替换为字符串 '-0330'

在 3.7 版更改: UTC 时差不再限制为一个整数分钟值。

在 3.7 版更改: 当提供 %z 指令给 strptime() 方法时,UTC 差值可以在时、分和秒之间使用冒号分隔符。 例如,'+01:00:00' 将被解读为一小时的差值。 此外,提供 'Z' 就相当于 '+00:00'

%:z

行为与 %z 相同,但在时,分和秒之间有冒号分隔符。

%Z

在 strftime() 中,如果 tzname() 返回 None 则 %Z 会被替换为一个空字符串;在其他情况下 %Z 会被替换为返回值,该值必须为一个字符串。

strptime() 仅接受特定的 %Z 值:

1、你的机器的区域设置可以是 time.tzname 中的任何值

2、硬编码的值 UTC 和 GMT

这样生活在日本的人可用的值为 JSTUTC 和 GMT,但可能没有 EST。 它将引发 ValueError 表示无效的值。

7、当与 strptime() 方法一起使用时,%U 和 %W 仅用于指定星期几和日历年份 (%Y) 的计算。

8、类似于 %U 和 %W%V 仅用于在 strptime() 格式字符串中指定星期几和 ISO 年份 (%G) 的计算。 还要注意 %G 和 %Y 是不可交换的。

9、当与 strptime() 方法一起使用的,前导的零在格式 %d%m%H%I%M%S%j%U%W 和 %V 中是可选的。 格式 %y 则要求有前导的零。

更多详情请看官方文档 :datetime --- 基本日期和时间类型 — Python 3.12.1 文档

总结

datetime库主要分为三个部分

1、表示日期时间类

date日期类(表示年、月、日)、time时间类(表示时、分、秒)、datetime日期时间类(表示日期+时间的结合)

2、表示时间差类

timedelta(表示年、月、日、时、分、秒、微秒),用于处理时间加减等操作。

3、表示时区类

tzinfo、timezone

附:strftime()显示格式代码

date、time和datetime类都支持这个方法。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值