跳转到内容

用户:Xyy23330121/Python/日期与时间内容列表

来自维基学院

读者可能注意到,日期与时间章节的内容很多。为此,User:Xyy23330121/Python/日期与时间 只提供索引。更详细的内容,我们留在这个页面。

日期由两种方式来表示:

  1. 只有数字的基础格式,比如:19700101
  2. - 分隔的扩展格式,比如:1970-01-01

其中对于年份,0001 代表公元 1 年,0000 代表公元前 1 年。月份必须是 01 ~ 12 之间的数字,而日期必须是 01 ~ 31 之间的数字。

降低精度的日期
[编辑 | 编辑源代码]

扩展格式可以降低精度,比如 1970-01 或 1970。它们的精度分别是月和年,而非日期。

扩展日期
[编辑 | 编辑源代码]

公元前的年份、以及公元10000年以后的年份。由交流双方决定增加的位数,且年份前必须加上 +-。比如:

  1. -0001,双方决定不增加位数,公元前2年。
  2. +010000,双方决定增加2位,公元10000年。
星期表示法
[编辑 | 编辑源代码]

可以把月份的部分改为星期数,具体方式比如:1970-W01-4 和 1970W014。其中,星期数在 01 ~ 53 之间,而天数在 1 ~ 7 之间。天数 1 代表该星期的星期一。

如果某年的 1 月 1 日是星期一到星期四,则该年的 1 月 1 日在第一个星期里。否则,该年的 1 月 1 日被视为在上一年的第 52 个星期或第 53 个星期里。

类似,星期表示法也可以降低精度。此时不要求必须用扩展格式。比如 1970W01 和 1970-W01 都是合法的。

序数日期
[编辑 | 编辑源代码]

也可以单独用日期数来表示日期。比如:

  1. 1970-001 表示 1970 年的第 1 天,即 1970 年 1 月 1 日

类似日期,时间也由两种方式来表示:

  1. 只有数字的基础格式,比如:000000
  2. : 分隔的扩展格式,比如:00:00:00
降低精度的时间
[编辑 | 编辑源代码]
缺少的内容 基础格式 扩展格式 代表
-0000 -00:00 零分零秒
0000 00:00 零时零分
时、秒 -00 零分
分、秒 00 零时

可以以十进制小数的形式,在秒的后面增加内容。比如:000000.0 或 00:00:00.0。这同样适用于“降低精度的时间”

在最后,可以添加时区信息。比如,如果时区是 UTC+8,则可以表示为160000+0800,或16:00:00+08:00。对于零时区,则添加Z,比如000000Z,或00:00:00Z。

组合表示

[编辑 | 编辑源代码]

当需要组合表示是,使用“日期T时间”的格式,比如19700101T000000.0Z,或1970-01-01T00:00:00.0Z

time.struct_time

[编辑 | 编辑源代码]

纪元秒数转换为 time.struct_time

[编辑 | 编辑源代码]

time.gmtime([secs])

[编辑 | 编辑源代码]

把纪元秒数转换为 time.struct_time,一秒以内的小数将被忽略。其中,夏令时信息始终为零,时区为零时区。

如果不输入 secs,则使用当前时间生成。

time.localtime([secs])

[编辑 | 编辑源代码]

把纪元秒数转换为 time.struct_time,一秒以内的小数将被忽略。其中,夏令时信息以及时区信息由操作系统给出。

如果不输入 secs,则使用当前时间生成。

time.strftime 的转换内容表格
字符串
内容
转换为
%c time.asctime(t) 的结果
%x 日期,比如 01/31/70 表示 1970 年 1 月 31 日
%X 时间,比如 00:00:00
%y 00 ~ 99 的二位整数,代表年份
%Y 十进制数表示的带世纪的年份。
%b 月份缩写,比如 Jan
%B 完整月份,比如 January
%m 01 ~ 12 的二位整数,代表月份
%d 01 ~ 31 的二位整数,代表日期
%H 00 ~ 23 的二位整数,代表小时
%I 01 ~ 12 的二位整数,代表小时(12小时制)
%p AM 或 PM
%M 00 ~ 59 的二位整数,表示分钟
%S 00 ~ 61 的二位整数,表示秒
%j 001 ~ 366 的三位整数,代表日期在当年的天数
%a 星期缩写,比如 Mon
%A 完整星期,比如 Monday
%w 0 ~ 6 的整数,0 表示周日
%W 00 ~ 53 的二位整数,表示星期数。
以星期一作为一周的第一天。
在当年第一个星期一之前的日期,被认为是在第 0 周。
%U 00 ~ 53 的二位整数,表示星期数。
以星期日作为一周的第一天。
在当年第一个星期日之前的日期,被认为是在第 0 周。
%z -23:59 ~ +23:59 的内容,代表时区偏移
%% 字符%

time.struct_time 转换为字符串格式化

[编辑 | 编辑源代码]

time.asctime([t])

[编辑 | 编辑源代码]

把 time.struct_time 转换为形如 Thu Jan 11 00:00:00 1970 的内容。

如果不输入 t,则使用当前时间生成。如果日期仅有 1 位,则会用空格进行缩进,比如:Thu Jan 1 00:00:00 1970

time.strftime(format[, t])

[编辑 | 编辑源代码]

按字符串 format 所示的格式将 time.struct_time 转换为字符串。

类似 time.asctime。如果不输入 t,则使用当前时间生成。

转换内容的列表见右边。

字符串格式化转换为 time.struct_time

[编辑 | 编辑源代码]

time.strptime(string[, format])

[编辑 | 编辑源代码]

我们可以把 time.strftime 给出的结果,用此函数给转换回 time.struct_time。

如果 format 未给出,默认为 time.asctime 所使用的格式。

time.struct_time 转换为纪元秒数

[编辑 | 编辑源代码]

time.mktime(t) -> float

[编辑 | 编辑源代码]

将 time.struct_time 转换为纪元秒数。

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

datetime.datetime

[编辑 | 编辑源代码]

为防止混淆以及简便起见,本章节以下的内容均使用了 import datetime as dt

直接生成对应的dt对象

[编辑 | 编辑源代码]

@classmethod dt.datetime(year, month, day)

[编辑 | 编辑源代码]

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

此函数会根据给出的内容创建 dt.datetime 对象。

tzinfo 的内容会原封不动地直接变成 dt.datetime 对象的属性。

类似,我们有以下方法:

  • dt.date(year, month, day)
    类似的方法,但创建 dt.date
  • dt.time()
    dt.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
    类似的方法,但创建 dt.time

ISO周历生成dt对象

[编辑 | 编辑源代码]

dt.datetime.fromisocalendar(year, week, day)

[编辑 | 编辑源代码]

按照 ISO 8601 星期表示法 的信息,生成对应的 dt.datetime 实例。

类似,我们有:

  • dt.date.fromisocalendar(year, week, day)

dt对象给出ISO周历

[编辑 | 编辑源代码]

dt.datetime.isocalendar()

[编辑 | 编辑源代码]

给出对应的 ISO 周历对象。

返回的对象可以用数字索引,此时该对象类似 (year, week, day);也可以使用属性 year、week 和 day 来访问对应信息。

该对象中,星期一用整数 1 表示,而星期日用整数 7 表示。

类似,我们有:

  • dt.date.isocalendar()

当前时间转化为 dt.datetime / dt.date

[编辑 | 编辑源代码]

@classmethod dt.datetime.today()

[编辑 | 编辑源代码]

创建对应本地时间的 dt.datetime 对象。该对象的 tzinfo 属性为 None

类似,我们有:

  • dt.date.today()
    创建对应当前日期的 dt.date 对象。

作为扩展,我们有:

  • dt.datetime.now(tz = None)
    类似上面的 dt.datetime.today 但是可以包含时区对象。
  • dt.datetime.utcnow()
    使用 UTC 零时区的时间。返回对象的 tzinfo 属性为 None

纪元秒数转化为 dt.datetime / dt.date

[编辑 | 编辑源代码]

@classmethod dt.datetime.fromtimestamp(timestamp, tz=None)

[编辑 | 编辑源代码]

将纪元秒数转化为 dt.datetime 对象。使用本地时间。

类似,我们有:

  • dt.date.fromtimestamp(timestamp)
    转化为对应日期的 dt.date对象。

作为扩展,我们有:

  • dt.datetime.utcfromtimestamp(timestamp)
    使用 UTC 零时区的时间。返回对象的 tzinfo 属性为 None

dt.datetime 转化为纪元秒数

[编辑 | 编辑源代码]

dt.datetime.timestamp()

[编辑 | 编辑源代码]

返回对应 dt.datetime 实例的纪元秒数。

ISO8601 转化为对应的dt对象

[编辑 | 编辑源代码]

@classmethod dt.datetime.fromisoformat(date_string)

[编辑 | 编辑源代码]

输入 ISO-8601 标准的字符串,返回其对应的 dt.datetime 对象。

但是,日期的部分不支持以下三种方式:

  1. 降低精度的日期,比如 YYYY-MM 或 YYYY
  2. 扩展日期表示形式,比如 -YYYYY-MM-DD
  3. 序数日期,比如 YYYY-OOO

特别的,作为分隔符的 T 可以用任何单个字符来替代,比如空格。

时区的部分会按给出的字符串自动设置。如果字符串未给出时区,则所生成对象的属性 tzinfoNone

类似,我们有:

  • dt.date.fromisoformat(date_string)
    返回对应日期的 dt.date 对象。作为参数的字符串仅能包含日期的部分,不可以包含时间的部分。
  • dt.time.fromisoformat(time_string)
    返回对应时间的 dt.time 对象。作为参数的字符串仅能包含时间的部分,不可以包含日期的部分。

dt对象转化为ISO8601

[编辑 | 编辑源代码]

dt.datetime.isoformat(sep='T', timespec='auto')

[编辑 | 编辑源代码]

该函数会把 dt.datetime 实例转化为对应的 ISO 8601 字符串。可以通过 sep 参数自定义日期部分和时间部分之间的分隔符。日期部分和时间部分使用的格式均为扩展格式。

timespec 参数则代表精确度。各个精确度选项对应的内容如下:

timespec参数 注释
'auto' 自动,如果不包含微秒则为 'second',否则为'microseconds'
'hours' 时间部分为 HH 格式,多余的会被截断(而非四舍五入)
'minutes' 时间部分为 HH:MM 格式,多余的会被截断
'seconds' 时间部分为 HH:MM:SS 格式,多余的会被截断
'milliseconds' 时间部分为 HH:MM:SS.fff 格式,多余的会被截断
'microseconds' 时间部分为 HH:MM:SS.ffffff 格式,多余的会被截断

类似,我们有:

  • dt.date.isoformat()
  • dt.time.isoformat(timespec='auto')

天数序号转化为 dt.datetime / dt.date

[编辑 | 编辑源代码]

@classmethod dt.datetime.fromordinal(ordinal)

[编辑 | 编辑源代码]

输入自公元元年以来的天数,返回对应的 dt.datetime 对象。其中,天数 1 对应公元 1 年 1 月 1 日。其时、分、秒、微秒均为零。

类似,我们有:

  • dt.date.fromordinal(ordinal)
    返回对应的 dt.date 对象。

dt对象转化为天数序号

[编辑 | 编辑源代码]

dt.datetime.toordinal()

[编辑 | 编辑源代码]

上面方法的逆方法。类似,有 dt.date.toordinal()


具体时间修改dt对象

[编辑 | 编辑源代码]

dt.datetime.replace()

[编辑 | 编辑源代码]

dt.datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=self.fold)

对于已有的 dt.datetime 实例,我们可以用这个方法,创建该实例修改后的副本。 类似,我们有:

  • dt.date.replace()
  • dt.time.replace()

时区修改dt.datetime

[编辑 | 编辑源代码]

dt.datetime.astimezone(tz=None)

[编辑 | 编辑源代码]

按照给出的时区修改 dt.datetime 实例,返回修改后的副本。修改后的副本,其表示的时间将与原对象相同——只是时区不同。


dt对象转化为 time.struct_time

[编辑 | 编辑源代码]

dt.datetime.timetuple()

[编辑 | 编辑源代码]

返回对应的 time.struct_time 实例。夏令时信息和时区信息会被自动设置。

类似,我们有:

  • dt.date.timetuple()
    返回对应的 time.struct_time,其时、分、秒、时区等都为零

作为扩展,我们有:

  • dt.datetime.utctimetuple()
    返回对应的 time.struct_time,但返回的是转化为UTC零时区的版本。

dt与字符串格式化

[编辑 | 编辑源代码]
字符串
内容
替换为 示例 备注
%Y 1970
%m 01 二位数字
%d 02 二位数字
%H 时(24小时制) 03 二位数字
%I 时(12小时制) 03 二位数字
%p AM / PM AM
%M 04 二位数字
%S 05 二位数字
%f 微秒 000006 六位数字
%a 星期缩写 Fri
%A 完整星期 Friday
%w 星期数字 5 0 ~ 6 的数字,0 表示星期日
%b 月份缩写 Jan
%B 月份全称 January
%y 70 不包含四位年份的前两位
%:z 时区标记 +08:00 如果 tzinfo 为 None
则这些会转化为空字符串
%z 时区标记 +0800
%Z 时区名称 中国标准时间
%c 完整表示 Fri Jan 2 03:04:05 1970
%x 日期 01/02/70
%X 时间 03:04:05
%j 天数 002 表示当天是该年的第几天
%U 星期数 00 表示当天在该年的第几个星
期,以星期日为每周第一天。
在当年第一个星期日之前的
天数,被视为在第00周。
%W 星期数 00 表示当天在该年的第几个星
期,以星期一为每周第一天。
在当年第一个星期一之前的
天数,被视为在第00周。
%% 字符% %
%G 星期历年份 1970 ISO 8601 标准中,年末年
初的几天可能会被算在另一
年的星期中。
%u 星期历星期 5
%V 星期历星期数 01

dt.datetime.strftime(format)

[编辑 | 编辑源代码]

按照给出的字符串 format,使用实例的信息替换该字符串中右表的内容,并返回替换的结果。

右表的示例是使用以下对象替换的:

datetime(
  year   = 1970,
  month  = 1,
  day    = 2,
  hour   = 3,
  minute = 4,
  second = 5,
  microsecond = 6,
  tzinfo = timezone(
    timedelta(hours=8),
    name= "中国标准时间"))

根据 Python 文档的描述,这些替换结果会随语言的改变而改变其具体格式——比如 AM 的大小写。

类似,我们有:

  • dt.date.strftime(format)
  • dt.time.strftime(format)

classmethod dt.datetime.strptime(date_string, format)

[编辑 | 编辑源代码]

将一个包含年、月、日信息的字符串,按照右侧表格所述的格式读取,并转换为对应的 dt.datetime 实例。

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000