使用者:Xyy23330121/Python/日期與時間內容列表

讀者可能注意到,日期與時間章節的內容很多。為此,User:Xyy23330121/Python/日期與時間 只提供索引。更詳細的內容,我們留在這個頁面。

ISO 8601

編輯

日期

編輯

日期由兩種方式來表示:

  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