User:Xyy23330121/Python/日期与时间内容列表
读者可能注意到,日期与时间章节的内容很多。为此,User:Xyy23330121/Python/日期与时间 只提供索引。更详细的内容,我们留在这个页面。
ISO 8601
编辑日期
编辑日期由两种方式来表示:
- 只有数字的基础格式,比如:19700101
- 用
-
分隔的扩展格式,比如:1970-01-01
其中对于年份,0001 代表公元 1 年,0000 代表公元前 1 年。月份必须是 01 ~ 12 之间的数字,而日期必须是 01 ~ 31 之间的数字。
降低精度的日期
编辑扩展格式可以降低精度,比如 1970-01 或 1970。它们的精度分别是月和年,而非日期。
扩展日期
编辑公元前的年份、以及公元10000年以后的年份。由交流双方决定增加的位数,且年份前必须加上 +
或 -
。比如:
- -0001,双方决定不增加位数,公元前2年。
- +010000,双方决定增加2位,公元10000年。
星期表示法
编辑可以把月份的部分改为星期数,具体方式比如:1970-W01-4 和 1970W014。其中,星期数在 01 ~ 53 之间,而天数在 1 ~ 7 之间。天数 1 代表该星期的星期一。
如果某年的 1 月 1 日是星期一到星期四,则该年的 1 月 1 日在第一个星期里。否则,该年的 1 月 1 日被视为在上一年的第 52 个星期或第 53 个星期里。
类似,星期表示法也可以降低精度。此时不要求必须用扩展格式。比如 1970W01 和 1970-W01 都是合法的。
序数日期
编辑也可以单独用日期数来表示日期。比如:
- 1970-001 表示 1970 年的第 1 天,即 1970 年 1 月 1 日
时间
编辑类似日期,时间也由两种方式来表示:
- 只有数字的基础格式,比如:000000
- 用
:
分隔的扩展格式,比如: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
,则使用当前时间生成。
字符串 内容 |
转换为 |
---|---|
%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 转换为纪元秒数。
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 对象。
但是,日期的部分不支持以下三种方式:
- 降低精度的日期,比如 YYYY-MM 或 YYYY
- 扩展日期表示形式,比如 -YYYYY-MM-DD
- 序数日期,比如 YYYY-OOO
特别的,作为分隔符的 T
可以用任何单个字符来替代,比如空格。
时区的部分会按给出的字符串自动设置。如果字符串未给出时区,则所生成对象的属性 tzinfo
为 None
类似,我们有:
- 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 实例。