用戶: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 實例。