datetime 您所在的位置:网站首页 python如何获取当前年份 datetime

datetime

2024-05-01 04:12| 来源: 网络整理| 查看: 265

datetime --- 基本日期和时间类型¶

源代码: Lib/datetime.py

datetime 模块提供了用于操作日期和时间的类。

在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。

小技巧

跳到 格式代码。

参见

模块 calendar

通用日历相关函数

模块 time

时间的访问和转换

zoneinfo 模块

代表 IANA 时区数据库的具体时区。

dateutil 包

具有扩展时区和解析支持的第三方库。

包 DateType

引入了几种独特的静态类型的第三方库,例如允许 静态类型检查器 区分简单型和感知型日期时间。

感知型对象和简单型对象¶

日期和时间对象可以根据它们是否包含时区信息而分为“感知型”和“简单型”两类。

充分掌握应用性算法和政治性时间调整信息例如时区和夏令时的情况下,一个 感知型 对象就能相对于其他感知型对象来精确定位自身时间点。 感知型对象是用来表示一个没有解释空间的固定时间点。 [1]

简单型 对象没有包含足够多的信息来无歧义地相对于其他 date/time 对象来定位自身时间点。 不论一个简单型对象所代表的是世界标准时间(UTC)、当地时间还是某个其他时区的时间完全取决于具体程序,就像一个特定数字所代表的是米、英里还是质量完全取决于具体程序一样。 简单型对象更易于理解和使用,代价则是忽略了某些现实性考量。

对于要求感知型对象的应用,datetime 和 time 对象具有一个可选的时区信息属性 tzinfo,它可被设为抽象类 tzinfo 的子类的一个实例。 这些 tzinfo 对象会捕获与 UTC 时间的差值、时区名称以及夏令时是否生效等信息。

datetime 模块只提供了一个具体的 tzinfo 类,即 timezone 类。 timezone 类可以表示具有相对于 UTC 的固定时差的简单时区,例如 UTC 本身或北美 EST 和 EDT 时区等。 支持时区的详细程度取决于具体的应用。 世界各地的时间调整规则往往是政治性多于合理性,经常会发生变化,除了 UTC 之外并没有一个能适合所有应用的标准。

常量¶

datetime 模块导出了以下常量:

datetime.MINYEAR¶

date 或 datetime 对象允许的最小年份数值。 MINYEAR 为 1。

datetime.MAXYEAR¶

date 或 datetime 对象允许的最大年份数值。 MAXYEAR 为 9999。

datetime.UTC¶

UTC 时区单例 datetime.timezone.utc 的别名。

Added in version 3.11.

有效的类型¶ class datetime.date

一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。 属性: year, month, and day。

class datetime.time

一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24*60*60 秒。 (这里没有“闰秒”的概念。) 包含属性: hour, minute, second, microsecond 和 tzinfo。

class datetime.datetime

日期和时间的结合。属性:year, month, day, hour, minute, second, microsecond, and tzinfo.

class datetime.timedelta

将两个 datetime 或 date 实例之间的差值表示为微秒级精度的持续时间。

class datetime.tzinfo

一个描述时区信息对象的抽象基类。 用来给 datetime 和 time 类提供自定义的时间调整概念(例如处理时区和/或夏令时)。

class datetime.timezone

一个实现了 tzinfo 抽象基类的子类,用于表示相对于 世界标准时间(UTC)的偏移量。

Added in version 3.2.

这些类型的对象都是不可变的。

子类关系

object timedelta tzinfo timezone time date datetime 通用的特征属性¶

date, datetime, time 和 timezone 类型共享这些通用特性:

这些类型的对象都是不可变的。

这些类型的对象是 hashable,意味着它们可以被用作字典的键。

这些类型的对象支持通过 pickle 模块进行高效的封存。

确定一个对象是感知型还是简单型¶

date 类型的对象都是简单型的。

time 或 datetime 类型的对象可以是感知型或者简单型。

一个 datetime 对象 d 在以下条件同时成立时将是感知型的:

d.tzinfo 不为 None

d.tzinfo.utcoffset(d) 不返回 None

在其他情况下,d 将是简单型的。

一个 time 对象 t 在以下条件同时成立时将是感知型的:

t.tzinfo 不为 None

t.tzinfo.utcoffset(None) 不返回 None。

在其他情况下,t 将是简单型的。

感知型和简单型之间的区别不适用于 timedelta 对象。

timedelta 类对象¶

timedelta 对象表示一段持续的时间,即两个 datetime 或 date 实例之间的差值。

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)¶

所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,并可以为正值或者负值。

只有 days, seconds 和 microseconds 会存储在内部。 参数单位的换算规则如下:

1毫秒会转换成1000微秒。

1分钟会转换成60秒。

1小时会转换成3600秒。

1星期会转换成7天。

日期、秒、微秒都是标准化的,所以它们的表达方式也是唯一的,例:

0 delta = timedelta( ... days=50, ... seconds=27, ... microseconds=10, ... milliseconds=29000, ... minutes=5, ... hours=8, ... weeks=2 ... ) >>> # Only days, seconds, and microseconds remain >>> delta datetime.timedelta(days=64, seconds=29156, microseconds=10)

在有任何参数为浮点型并且 microseconds 值为小数的情况下,从所有参数中余下的微秒数将被合并,并使用四舍五入偶不入奇的规则将总计值舍入到最接近的整数微秒值。 如果没有任何参数为浮点型的情况下,则转换和标准化过程将是完全精确的(不会丢失信息)。

如果标准化后的 days 数值超过了指定范围,将会抛出 OverflowError 异常。

请注意对负数值进行标准化的结果可能会令人感到惊讶。 例如:

>>> from datetime import timedelta >>> d = timedelta(microseconds=-1) >>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)

类属性:

timedelta.min¶

The most negative timedelta object, timedelta(-999999999).

timedelta.max¶

The most positive timedelta object, timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999).

timedelta.resolution¶

两个不相等的 timedelta 类对象最小的间隔为 timedelta(microseconds=1)。

请注意,因为标准化的缘故,timedelta.max 大于 -timedelta.min。 -timedelta.max 不可以表示为一个 timedelta 对象。

实例属性(只读):

属性

days

-999999999 至 999999999 ,含999999999

seconds

0 至 86399,包含86399

microseconds

0 至 999999,包含999999

支持的运算:

运算

结果:

t1 = t2 + t3

t2 和 t3 之和。 运算后 t1 - t2 == t3 且 t1 - t3 == t2 为真值。 (1)

t1 = t2 - t3

t2 和 t3 之差。 运算后 t1 == t2 - t3 且 t2 == t1 + t3 为真值。 (1)(6)

t1 = t2 * i or t1 = i * t2

时差乘以一个整数。 运算后如果 i != 0 则 t1 // i == t2 为真值。

通常情况下,t1  * i == t1 * (i-1) + t1 为真值。 (1)

t1 = t2 * f or t1 = f * t2

乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。

f = t2 / t3

总时长 t2 除以间隔单位 t3 (3)。 返回一个 float 对象。

t1 = t2 / f or t1 = t2 / i

除以一个浮点数或整数。 结果会被舍入到 timedelta 最接近的整数倍。 精度使用四舍五偶入奇不入规则。

t1 = t2 // i or t1 = t2 // t3

计算底数,其余部分(如果有)将被丢弃。在第二种情况下,将返回整数。 (3)

t1 = t2 % t3

余数为一个 timedelta 对象。(3)

q, r = divmod(t1, t2)

通过 : q = t1 // t2 (3) and r = t1 % t2 计算出商和余数。q是一个整数,r是一个 timedelta 对象。

+t1

返回一个相同数值的 timedelta 对象。

-t1

等于 timedelta(-t1.days, -t1.seconds*, -t1.microseconds),以及 t1 * -1。 (1)(4)

abs(t)

当 t.days >= 0 时等于 +t,而当 t.days >> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00

表达式 t2 - t3 通常与 t2 + (-t3) 是等价的,除非 t3 等于 timedelta.max; 在这种情况下前者会返回结果,而后者则会溢出。

除了上面列举的操作以外,timedelta 对象还支持与 date 和 datetime 对象进行特定的相加和相减运算(见下文)。

在 3.2 版本发生变更: 现在已支持 timedelta 对象与另一个 timedelta 对象相整除或相除,包括求余运算和 divmod() 函数。 现在也支持 timedelta 对象加上或乘以一个 float 对象。

timedelta 对象支持相等性和顺序比较。

在布尔运算中,timedelta 对象当且仅当其不等于 timedelta(0) 时则会被视为真值。

实例方法:

timedelta.total_seconds()¶

返回期间占用了多少秒。等价于 td / timedelta(seconds=1)。对于秒以外的间隔单位,直接使用除法形式 (例如 td / timedelta(microseconds=1))。

需要注意的是,时间间隔较大时,这个方法的结果中的微秒将会失真(大多数平台上大于270年视为一个较大的时间间隔)。

Added in version 3.2.

timedelta 用法示例¶

一个标准化的附加示例:

>>> # Components of another_year add up to exactly 365 days >>> from datetime import timedelta >>> year = timedelta(days=365) >>> another_year = timedelta(weeks=40, days=84, hours=23, ... minutes=50, seconds=600) >>> year == another_year True >>> year.total_seconds() 31536000.0

timedelta 算术运算的示例:

>>> from datetime import timedelta >>> year = timedelta(days=365) >>> ten_years = 10 * year >>> ten_years datetime.timedelta(days=3650) >>> ten_years.days // 365 10 >>> nine_years = ten_years - year >>> nine_years datetime.timedelta(days=3285) >>> three_years = nine_years // 3 >>> three_years, three_years.days // 365 (datetime.timedelta(days=1095), 3) date 对象¶

date 对象代表一个理想化历法中的日期(年、月和日),即当今的格列高利历向前后两个方向无限延伸。

公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。 [2]

class datetime.date(year, month, day)¶

所有参数都是必要的。 参数必须是在下面范围内的整数:

MINYEAR > date.fromisoformat('20191204') datetime.date(2019, 12, 4) >>> date.fromisoformat('2021-W01-1') datetime.date(2021, 1, 4)

Added in version 3.7.

在 3.11 版本发生变更: 在之前版本中,此方法仅支持一种格式 YYYY-MM-DD。

classmethod date.fromisocalendar(year, week, day)¶

返回指定 year, week 和 day 所对应 ISO 历法日期的 date。 这是函数 date.isocalendar() 的逆操作。

Added in version 3.8.

类属性:

date.min¶

最小的日期 date(MINYEAR, 1, 1) 。

date.max¶

最大的日期 ,date(MAXYEAR, 12, 31)。

date.resolution¶

两个日期对象的最小间隔,timedelta(days=1)。

实例属性(只读):

date.year¶

在 MINYEAR 和 MAXYEAR 之间,包含边界。

date.month¶

1 至 12(含)

date.day¶

返回1到指定年月的天数间的数字。

支持的运算:

运算

结果:

date2 = date1 + timedelta

date2 将为 date1 之后的 timedelta.days 日。 (1)

date2 = date1 - timedelta

计算 date2 使得 date2 + timedelta == date1。 (2)

timedelta = date1 - date2

(3)

date1 == date2 date1 != date2

相等性比较。 (4)

date1 date2 date1 = date2

顺序比较。 (5)

注释:

如果 timedelta.days > 0 则 date2 将在时间线上前进,如果 timedelta.days from datetime import date >>> d = date(2002, 12, 31) >>> d.replace(day=26) datetime.date(2002, 12, 26) date.timetuple()¶

返回一个 time.struct_time,即 time.localtime() 所返回的类型。

hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。

d.timetuple() 等价于:

time.struct_time((d.year, d.month, d.day, 0, 0, 0, d.weekday(), yday, -1))

其中 yday = d.toordinal() - date(d.year, 1, 1).toordinal() + 1 是当前年份中的日期序号,起始值 1 表示 1 月 1 日。

date.toordinal()¶

返回日期的预期格列高利历序号,其中公元 1 年 1 月 1 日的序号为 1。 对于任意 date 对象 d,date.fromordinal(d.toordinal()) == d。

date.weekday()¶

返回一个整数代表星期几,星期一为0,星期天为6。例如, date(2002, 12, 4).weekday() == 2,表示的是星期三。参阅 isoweekday()。

date.isoweekday()¶

返回一个整数代表星期几,星期一为1,星期天为7。例如:date(2002, 12, 4).isoweekday() == 3,表示星期三。参见 weekday(), isocalendar()。

date.isocalendar()¶

返回一个由三部分组成的 named tuple 对象: year, week 和 weekday。

ISO 历法是一种被广泛使用的格列高利历。 [3]

ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。 一个 ISO 年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。 这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。

例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日:

>>> from datetime import date >>> date(2003, 12, 29).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=1) >>> date(2004, 1, 4).isocalendar() datetime.IsoCalendarDate(year=2004, week=1, weekday=7)

在 3.9 版本发生变更: 结果由元组改为 named tuple。

date.isoformat()¶

返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串:

>>> from datetime import date >>> date(2002, 12, 4).isoformat() '2002-12-04' date.__str__()¶

对于日期对象 d, str(d) 等价于 d.isoformat() 。

date.ctime()¶

返回一个表示日期的字符串:

>>> from datetime import date >>> date(2002, 12, 4).ctime() 'Wed Dec 4 00:00:00 2002'

d.ctime() 等效于:

time.ctime(time.mktime(d.timetuple()))

在原生 C ctime() 函数 (time.ctime() 会发起调用该函数,但 date.ctime() 则不会) 遵循 C 标准的平台上。

date.strftime(format)¶

返回一个由显式格式字符串所控制的,代表日期的字符串。 表示时、分或秒的格式代码值将为 0。 另请参阅 strftime() 和 strptime() 的行为 和 date.isoformat()。

date.__format__(format)¶

与 date.strftime() 相同。 此方法使得在 格式化字符串字面值 中以及使用 str.format() 时为 date 对象指定格式字符串成为可能。 另请参阅 strftime() 和 strptime() 的行为 和 date.isoformat()。

date 用法示例¶

计算距离特定事件天数的例子:

>>> import time >>> from datetime import date >>> today = date.today() >>> today datetime.date(2007, 12, 5) >>> today == date.fromtimestamp(time.time()) True >>> my_birthday = date(today.year, 6, 24) >>> if my_birthday >> my_birthday datetime.date(2008, 6, 24) >>> time_to_birthday = abs(my_birthday - today) >>> time_to_birthday.days 202

使用 date 的更多例子:

>>> from datetime import date >>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001 >>> d datetime.date(2002, 3, 11) >>> # Methods related to formatting string output >>> d.isoformat() '2002-03-11' >>> d.strftime("%d/%m/%y") '11/03/02' >>> d.strftime("%A %d. %B %Y") 'Monday 11. March 2002' >>> d.ctime() 'Mon Mar 11 00:00:00 2002' >>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month") 'The day is 11, the month is March.' >>> # Methods for to extracting 'components' under different calendars >>> t = d.timetuple() >>> for i in t: ... print(i) 2002 # year 3 # month 11 # day 0 0 0 0 # weekday (0 = Monday) 70 # 70th day in the year -1 >>> ic = d.isocalendar() >>> for i in ic: ... print(i) 2002 # ISO year 11 # ISO week number 1 # ISO day number ( 1 = Monday ) >>> # A date object is immutable; all operations produce a new object >>> d.replace(year=2005) datetime.date(2005, 3, 11) datetime 对象¶

datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。

与 date 对象一样,datetime 假定当前的格列高利历向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。

构造器 :

class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)¶

year, month 和 day 参数是必须的。 tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。 其余的参数必须是在下面范围内的整数:

MINYEAR >> datetime.fromisoformat('20111104T000523') datetime.datetime(2011, 11, 4, 0, 5, 23) >>> datetime.fromisoformat('2011-W01-2T00:05:23.283') datetime.datetime(2011, 1, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000) >>> datetime.fromisoformat('2011-11-04 00:05:23.283+00:00') datetime.datetime(2011, 11, 4, 0, 5, 23, 283000, tzinfo=datetime.timezone.utc) >>> datetime.fromisoformat('2011-11-04T00:05:23+04:00') datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

Added in version 3.7.

在 3.11 版本发生变更: 在之前版本中,此方法仅支持可以由 date.isoformat() 或 datetime.isoformat() 发出的格式。

classmethod datetime.fromisocalendar(year, week, day)¶

返回以 year, week 和 day 值指明的 ISO 历法日期所对应的 datetime。 该datetime 对象的非日期部分将使用其标准默认值来填充。 这是函数 datetime.isocalendar() 的逆操作。

Added in version 3.8.

classmethod datetime.strptime(date_string, format)¶

返回一个对应于 date_string,根据 format 进行解析得到的 datetime 对象。

如果 format 不包含微秒或时区信息,这将等价于:

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

如果 date_string 和 format 无法被 time.strptime() 解析或它返回一个不是时间元组的值则将引发 ValueError。 另请参阅 strftime() 和 strptime() 的行为 和 datetime.fromisoformat()。

类属性:

datetime.min¶

最早的可表示 datetime,datetime(MINYEAR, 1, 1, tzinfo=None)。

datetime.max¶

最晚的可表示 datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)。

datetime.resolution¶

两个不相等的 datetime 对象之间可能的最小间隔,timedelta(microseconds=1)。

实例属性(只读):

datetime.year¶

在 MINYEAR 和 MAXYEAR 之间,包含边界。

datetime.month¶

1 至 12(含)

datetime.day¶

返回1到指定年月的天数间的数字。

datetime.hour¶

取值范围是 range(24)。

datetime.minute¶

取值范围是 range(60)。

datetime.second¶

取值范围是 range(60)。

datetime.microsecond¶

取值范围是 range(1000000)。

datetime.tzinfo¶

作为 tzinfo 参数被传给 datetime 构造器的对象,如果没有传入值则为 None。

datetime.fold¶

取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间的歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当前时区的 UTC 时差减少就会出现重复时间段。) 取值 0 和 1 分别表示两个相同边界时间表示形式的前一个和后一个时间。

Added in version 3.6.

支持的运算:

运算

结果:

datetime2 = datetime1 + timedelta

(1)

datetime2 = datetime1 - timedelta

(2)

timedelta = datetime1 - datetime2

(3)

datetime1 == datetime2 datetime1 != datetime2

相等性比较。 (4)

datetime1 datetime2 datetime1 = datetime2

顺序比较。 (5)

datetime2 是 datetime1 去掉 timedelta 时间段的结果,如果 timedelta.days > 0 则是在时间线上前进,如果 timedelta.days > for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname()) ... 05:00:00 UTC = 00:00:00 EST 06:00:00 UTC = 01:00:00 EST 07:00:00 UTC = 03:00:00 EDT 08:00:00 UTC = 04:00:00 EDT

当 DST 结束时(见 "end" 行),会有更糟糕的潜在问题:本地时间值中有一个小时是不可能没有歧义的:夏令时的最后一小时。 即以北美东部时间表示当天夏令时结束时的形式为 5:MM UTC 的时间。 本地时钟从 1:59(夏令时)再次跳回到 1:00(标准时)。 形式为 1:MM 的本地时间就是有歧义的。 此时 astimezone() 是通过将两个相邻的 UTC 小时映射到两个相同的本地小时来模仿本地时钟的行为。 在这个北美东部时间的示例中,形式为 5:MM 和 6:MM 的 UTC 时间在转换为北美东部时间时都将被映射到 1:MM,但前一个时间会将 fold 属性设为 0 而后一个时间会将其设为 1。 例如,在 2016 年秋季时钟往回调整时,我们得到:

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc) >>> for i in range(4): ... u = u0 + i*HOUR ... t = u.astimezone(Eastern) ... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold) ... 04:00:00 UTC = 00:00:00 EDT 0 05:00:00 UTC = 01:00:00 EDT 0 06:00:00 UTC = 01:00:00 EST 1 07:00:00 UTC = 02:00:00 EST 0

请注意不同的 datetime 实例仅通过 fold 属性值来加以区分,它们在比较时会被视为相等。

不允许时间显示存在歧义的应用程序需要显式地检查 fold 属性的值,或者避免使用混合式的 tzinfo 子类;当使用 timezone 或者任何其他固定差值的 tzinfo 子类(例如仅表示 EST (固定差值 -5 小时),或仅表示 EDT (固定差值 -4 小时) 的类时是不会有歧义的)。

参见

zoneinfo

datetime 模块有一个基本 timezone 类(用来处理任意与 UTC 的固定时差)及其 timezone.utc 属性(UTC 时区实例)。

zoneinfo 为 Python 带来了 IANA时区数据库 (也被称为 Olson 数据库),推荐使用它。

IANA 时区数据库

该时区数据库 (通常称为 tz, tzdata 或 zoneinfo) 包含大量代码和数据用来表示全球许多有代表性的地点的本地时间的历史信息。 它会定期进行更新以反映各政治实体对时区边界、UTC 差值和夏令时规则的更改。

timezone 对象¶

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

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

class datetime.timezone(offset, name=None)¶

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

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

Added in version 3.2.

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

timezone.utcoffset(dt)¶

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

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

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

timezone.tzname(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'。

timezone.dst(dt)¶

总是返回 None。

timezone.fromutc(dt)¶

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

类属性:

timezone.utc¶

UTC 时区,timezone(timedelta(0))。

strftime() 和 strptime() 的行为¶

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

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

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

strftime

strptime

用法

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

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

方法类型

实例方法

类方法

方法

date; datetime; time

datetime

签名

strftime(format)

strptime(date_string, format)

strftime() 和 strptime() 格式码¶

这些方法接受可被用于解析和格式化日期的格式代码:

>>> datetime.strptime('31/01/22 23:59:59.999999', ... '%d/%m/%y %H:%M:%S.%f') datetime.datetime(2022, 1, 31, 23, 59, 59, 999999) >>> _.strftime('%a %d %b %Y, %I:%M%p') 'Mon 31 Jan 2022, 11:59PM'

以下列表显示了 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) 文档。 不同的平台在处理不支持的格式说明符方面也有差异。

Added in version 3.6: 增加了 %G, %u 和 %V。

Added in version 3.12: 增加了 %:z。

技术细节¶

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

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

使用 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 或只返回一个空字符串。

注释:

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

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

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

在 3.3 版本发生变更: 在 3.2 版中,strftime() 方法只限用于 >= 1000 的年份。

当与 strptime() 方法一起使用时,如果使用 %I 指示符来解析时,则 %p 指示符只会影响输出时字段。

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

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

对于简单型对象,%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 版本发生变更: 当向 strptime() 方法提供 %z 指示符时,UTC 差值可以在时、分和秒之间使用冒号作为分隔符。 例如,'+01:00:00' 将被解读为一小时的差值。 此外,提供 'Z' 就相当于 '+00:00'。

%:z

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

%Z

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

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

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

硬编码的值 UTC 和 GMT

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

在 3.2 版本发生变更: 当提供 %z 指示符给 strptime() 方法时,将产生一个感知型 datetime 对象。 结果的 tzinfo 将被设为一个 timezone 实例。

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

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

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

备注

[1]

就是说如果我们忽略相对论效应的话。

[2]

这与 Dershowitz 和 Reingold 所著 Calendrical Calculations 中“预期格列高利”历法的定义一致,它是适用于该书中所有运算的基础历法。 请参阅该书了解在预期格利高利历序列与许多其他历法系统之间进行转换的算法。

[3]

请参阅 R. H. van Gent 所著 ISO 8601 历法的数学指南 以获取更完整的说明。

[4]

传入 datetime.strptime('Feb 29', '%b %d') 将导致错误,因为 1900 不是闰年。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有