欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python常用標(biāo)準(zhǔn)庫(kù)之時(shí)間模塊time和datetime

 更新時(shí)間:2022年05月27日 14:10:45   作者:小小垂髫  
time和datetime是Python中常用的兩個(gè)時(shí)間模塊,本文將通過(guò)示例詳細(xì)為大家講講二者的使用方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)

time時(shí)間模塊

import time

time -- 獲取本地時(shí)間戳

時(shí)間戳又被稱之為是Unix時(shí)間戳,原本是在Unix系統(tǒng)中的計(jì)時(shí)工具。

它的含義是從1970年1月1日(UTC/GMT的午夜)開(kāi)始所經(jīng)過(guò)的秒數(shù),不考慮閏秒。UNIX時(shí)間戳的 0 按照ISO 8601規(guī)范為 :1970-01-01T00:00:00Z。

比如:

  • 時(shí)間戳 60 表示 1970-01-01T00:01:00Z
  • 時(shí)間戳 120 表示 1970-01-01T00:02:00Z
  • 時(shí)間戳 3600 表示 1970-01-01T01:00:00Z

小知識(shí):最開(kāi)始的時(shí)候,時(shí)間戳的開(kāi)始年份是1971年,那個(gè)時(shí)候Unix系統(tǒng)和C語(yǔ)言剛剛誕生,所以時(shí)間戳0也就是Unix系統(tǒng)和C語(yǔ)言的生日。那時(shí)候的時(shí)間位數(shù)只有32位,而且每秒中有60個(gè)數(shù)字,發(fā)現(xiàn)只要兩年多的時(shí)間時(shí)間戳就能完成一個(gè)輪回,十分的不方便!所以后來(lái)的一系列改革,將時(shí)間戳的數(shù)值改為每秒1個(gè)數(shù)字,還有一些新的系統(tǒng)可以將時(shí)間戳的位數(shù)增大,可以讓時(shí)間戳的輪回?cái)U(kuò)展到一百多年,再后來(lái)為了方便人們記憶,將時(shí)間戳的起始年份定位1970年整。

import time

stamp_time = time.time()
print(stamp_time)  # 1635768368.2838552

localtime -- 獲取本地時(shí)間元組(UTC)

參數(shù)為時(shí)間戳,默認(rèn)為本地時(shí)間戳,獲取時(shí)間元組。

時(shí)間元組是python中的一個(gè)特殊的數(shù)據(jù)類型type: time.struct_time,但是它和tuple的特性是相同的。

import time

# 時(shí)間元組中的值分別表示:
	# tm_year: 年
	# tm_mon: 月
	# tm_mday: 日
	# tm_hour: 時(shí)
	# tm_min: 分
	# tm_sec: 秒
	# tm_wday: 周幾(0表示星期一)
	# tm_yday: 一年中的第幾天(從1開(kāi)始)
	# tm_isdst: 夏令標(biāo)識(shí)(1夏令時(shí)、0非夏令時(shí)、-1未知)

# 默認(rèn)當(dāng)前時(shí)間
time_tuple = time.localtime()
print(time_tuple)
# time.struct_time(tm_year=2021, tm_mon=11, tm_mday=1, tm_hour=20, tm_min=7, tm_sec=50, tm_wday=0, tm_yday=305, tm_isdst=0)

# 指定時(shí)間戳
time_tuple = time.localtime(3600)
print(time_tuple)
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

有大問(wèn)題啦?。?!

時(shí)間戳的起始時(shí)間是1970-1-1 0:0:0, 這個(gè)時(shí)候的時(shí)間戳是0,那么時(shí)間戳3600就是整整一個(gè)小時(shí)之后,那么時(shí)間就應(yīng)該是1970-1-1 0:1:0 才對(duì)的呀!怎么上面的3600確實(shí)9點(diǎn)鐘了呢?怎么起始時(shí)間變成了8點(diǎn)了呢?

然后你發(fā)現(xiàn)你在中國(guó),時(shí)間是北京時(shí)間,北京在東八區(qū)時(shí)區(qū),嘶,怎么正好也是個(gè)八?

是這樣的,按照道理來(lái)說(shuō)的話全世界任何一個(gè)地方的時(shí)間戳所代表的時(shí)間都應(yīng)該是一樣的,而且時(shí)間戳的起始時(shí)間確實(shí)是 1970-1-1 0:0:0 ,但是這個(gè)時(shí)間是位于英國(guó)的一個(gè)叫做格林威治的小鎮(zhèn)的,格林威治有一個(gè)天文臺(tái)叫做皇家格林尼治天文臺(tái),后來(lái)國(guó)際上將這個(gè)地方的經(jīng)線作為本初子午線,作為時(shí)間計(jì)算時(shí)間和地理精度的起點(diǎn)。那么,有時(shí)區(qū)的存在打破了這個(gè)可能,我們?cè)谥袊?guó),所有的設(shè)備都是按照中國(guó)的時(shí)區(qū)編碼的,中國(guó)位于東八區(qū),在時(shí)間上比英國(guó)快八個(gè)小時(shí),所以我們中國(guó)的本地時(shí)間戳就是 1970-1-1 8:00:00。

gmtime -- 獲取時(shí)間元組(GMT)

在不知道這個(gè)函數(shù)的時(shí)候,我就很好奇為什么localtime的初始時(shí)間比格林威治時(shí)間要快8小時(shí),現(xiàn)在就明白了:

函數(shù)描述
gmtime獲取時(shí)間元組(GMT格林威治時(shí)間)
localtime獲取時(shí)間元組(UTC協(xié)調(diào)世界時(shí))

mktime -- 時(shí)間元組獲取時(shí)間戳

注意:

  • 參數(shù)必須是時(shí)間元組time.struct_time 或者元組 tuple 類型;
  • 元組中的元素一個(gè)也不能少,必須九個(gè)元素都存在;
  • 得到的時(shí)間戳只收到前六個(gè)值的影響,即:年月日時(shí)分秒;
  • 時(shí)間元組中的時(shí)間表示,最小時(shí)間不能低于當(dāng)?shù)氐淖钚r(shí)間戳;
  • 時(shí)間元組中的時(shí)間表示,單位可以超出原本的范圍,比如秒滿60進(jìn)1,我們將秒寫成100,系統(tǒng)也不會(huì)報(bào)錯(cuò),但是時(shí)間上會(huì)自動(dòng)的將多出的時(shí)間進(jìn)位。但是數(shù)字也不能過(guò)大,因?yàn)閿?shù)據(jù)類型的大小是有極限的。
  • mktime返回的數(shù)值是浮點(diǎn)型的,但是精度只能到1;
import time

# 在中國(guó)的最小時(shí)間單位
tst = (1970, 1, 1, 8, 0, 0, 0, 0, 0)
time_stamp = time.mktime(tst)
print(time_stamp)  # 0.0

ctime -- 獲取時(shí)間字符串

參數(shù)默認(rèn)為本地時(shí)間戳,獲取的數(shù)據(jù)類型是 str,這個(gè)時(shí)間字符串不像時(shí)間元組是一個(gè)單獨(dú)的數(shù)據(jù)類型。

import time

# 時(shí)間字符串中的含義是:
	# Mon Nov  1 21:34:39 2021
    # 星期 月   日 時(shí) 分 秒  年

# 默認(rèn)為本地時(shí)間戳
time_char = time.ctime()
print(time_char)  # Mon Nov  1 21:34:39 2021

# 指定時(shí)間戳
time_char = time.ctime(0)
print(time_char)  # Thu Jan  1 08:00:00 1970

asctime -- 時(shí)間元組獲取時(shí)間字符串

注意,asctime有弊端,看下例:

import time

tst = (1970, 1, 1, 8, 24, 61, 1, 0, 0)
time_char = time.asctime(tst)
print(time_char)  # Tue Jan  1 08:24:61 1970

tst = (1970, 1, 1, 8, 24, 61, 2, 0, 0)
time_char = time.asctime(tst)
print(time_char)  # Tue Jan  1 08:24:61 1970

看上面的例子,時(shí)間元組變成時(shí)間字符串的時(shí)候,會(huì)將星期的數(shù)據(jù)也讀取到,但是卻不會(huì)分辨數(shù)據(jù)是否正確,所以asctime并不常用。

如果要將一個(gè)不確定正確性的時(shí)間元組變成時(shí)間字符串的話,先通過(guò) mktime 獲取時(shí)間戳(mktime可以分辨出正確的時(shí)間信息),然后在將時(shí)間戳通過(guò) ctime 變成時(shí)間字符串。

strftime -- 格式化時(shí)間

格式化時(shí)間,按照指定的格式(一段格式化字符串,就像字符串的格式化一樣)將時(shí)間元組變成時(shí)間字符串。

我們先來(lái)學(xué)習(xí)一下時(shí)間占位符的含義是什么:

注意?。?!這些占位符的大小寫的含義是不同的:

占位符含義
%Y以十進(jìn)制數(shù)字表示以世紀(jì)為單位的年份(四位數(shù))
%y以十進(jìn)制數(shù)字表示年份(兩位數(shù))
%m以十進(jìn)制數(shù)字表示月份
%D以月/日/年(兩位數(shù))的格式表示年月日
%d以十進(jìn)制數(shù)字表示日期
%H以十進(jìn)制數(shù)字表示二十四小時(shí)制的時(shí)
%M以十進(jìn)制數(shù)字表示分鐘
%S以十進(jìn)制數(shù)字表示秒
%z與UTC的時(shí)區(qū)偏移
%a區(qū)域設(shè)置的縮寫工作日名稱
%A區(qū)域設(shè)置的完整工作日名稱
%b區(qū)域設(shè)置的縮寫月份名稱
%B區(qū)域設(shè)置的完整月份名稱
%c語(yǔ)言環(huán)境的適當(dāng)日期和時(shí)間表示
%I以十進(jìn)制數(shù)表示十二小時(shí)制的時(shí)(大寫 ‘愛(ài)’)
%p語(yǔ)言環(huán)境的等效值:AM 或者 PM

現(xiàn)在根據(jù)使用時(shí)間占位符用字符串格式化將時(shí)間元組變成字符串。

import time

# 注意,如果格式化字符串中出現(xiàn)中文字符,只能在linux系統(tǒng)下運(yùn)行,windows下不能解析,直接報(bào)錯(cuò)。

tst = (1970, 1, 1, 8, 0, 0, 0, 0, 0)
time_tuple = time.strftime('%Y-%m-%d-%H-%m-%S',tst)
print(time_tuple)  # 1970-01-01-08-01-00

# 有中文在windows下報(bào)錯(cuò)
tst = (1970, 1, 1, 8, 0, 0, 0, 0, 0)
time_tuple = time.strftime('%Y-%m哈哈-%d-%H-%m-%S',tst)
print(time_tuple)  # 1970-01-01-08-01-00

strptime -- 格式化時(shí)間

格式化時(shí)間,通過(guò)格式化字符串將一個(gè)字符串中的時(shí)間變成時(shí)間元組。

import time

# 格式化字符串要和原字符串一模一樣,只是將需要提出的部分使用占位符替換
char = '2000年10月30日一個(gè)偉大的中國(guó)少年在三晉大地誕生了'
format_char = '%Y年%m月%d日一個(gè)偉大的中國(guó)少年在三晉大地誕生了'

tst = time.strptime(char, format_char)
print(tst)

sleep -- 時(shí)間睡眠

等待指定秒數(shù)的時(shí)間:

import time

print('開(kāi)始睡覺(jué)')
time.sleep(2)
print('睡了兩秒鐘,神清氣爽')

perf_counter -- 時(shí)間計(jì)時(shí)

用于計(jì)算程序運(yùn)行的時(shí)間

import time

# perf_counter 用于計(jì)算程序運(yùn)行的時(shí)間

# 記錄開(kāi)始時(shí)間
start_time = time.perf_counter()

# 程序運(yùn)行
for i in range(10000):
    pass

# 記錄時(shí)間
end_time = time.perf_counter()

# windows系統(tǒng)直接拿到第二次的值就可以了,不用減去第一次的值也行
print(end_time, '秒')  # 0.0003918 秒
print(end_time - start_time, '秒')  # 0.0003916 秒

如果使用多次perf_counter()函數(shù),直接輸出其的值是距第一次使用的時(shí)間長(zhǎng)度:

import time

time1 = time.perf_counter()
time.sleep(1)
time2 = time.perf_counter()
print(time2)

time.sleep(2)
time3 = time.perf_counter()
print(time3)

time.sleep(3)
time4 = time.perf_counter()
print(time4)

"""
結(jié)果:
1.0002558
3.0048941
6.019172
"""

注意:windows系統(tǒng)下使用perf_counter()函數(shù)可以直接輸出耗時(shí)長(zhǎng)度,每次的耗時(shí)默認(rèn)都是距離第一次使用perf_counter()函數(shù)的時(shí)間長(zhǎng)度;如果在linux系統(tǒng)下使用perf_counter()函數(shù)則必須要使用第二次的結(jié)果減去之前的結(jié)果,因?yàn)樵趌inux系統(tǒng)中perf_counter()函數(shù)的值和time()函數(shù)的值都是一樣的,那就是返回一個(gè)時(shí)間戳。

使用time.time()計(jì)算時(shí)間

import time

# perf_counter 用于計(jì)算程序運(yùn)行的時(shí)間

# 記錄開(kāi)始時(shí)間
start_time = time.time()

# 程序運(yùn)行
for i in range(10000):
    pass

# 記錄時(shí)間
end_time = time.time()

print(end_time - start_time, '秒')  # 0.001001119613647461 秒

耗時(shí)短的計(jì)時(shí)推薦使用pref_counter,耗時(shí)長(zhǎng)的推薦使用time。

模擬進(jìn)度條

# 1、定義進(jìn)度條樣式
print('[%-50s]' % ('###########'))
print('[%-50s]' % ('###################'))
print('[%-50s]' % ('###########################'))
print('[%-50s]' % ('####################################'))
print('[%-50s]' % ('########################################'))
# 2、讓進(jìn)度條動(dòng)起來(lái)
import time

progress_char = ''
for i in range(50):
    progress_char += '#'
    time.sleep(0.05)  # 延時(shí)看起來(lái)不是很快
    # end使不能換行,\r使進(jìn)度條不斷刷新,保持在同一行顯示;
    print('\r[%-50s]' % (progress_char), end='')
print('\n')
# 3、根據(jù)文件的大小調(diào)整進(jìn)度條的進(jìn)度
import time

def progress(percent):
    """控制進(jìn)度條的顯示
    參數(shù)是下載的百分比,用來(lái)控制進(jìn)度條的進(jìn)展
    """
    # 如果百分比超過(guò)了1,說(shuō)明數(shù)據(jù)已經(jīng)接受完畢
    if percent > 1:
        percent = 1

    # 打印對(duì)應(yīng)的進(jìn)度條效果
    char = '#' * int(percent * 50)
    print('\r[%-50s]%d%%' % (char, int(percent * 100)), end='')


# 已下的大小
rec_size = 0

# 下載文件的大小
total_size = 102400

# 模擬下載過(guò)程
while rec_size < total_size:
    rec_size += 10240  # 下載速度
    time.sleep(0.05)  # 模擬網(wǎng)絡(luò)延遲
    percent = rec_size / total_size  # 計(jì)算下載的進(jìn)度(百分比)
    # 調(diào)用進(jìn)度條
    progress(percent)

程序計(jì)時(shí)

在學(xué)習(xí)了perf_counter計(jì)時(shí)后,我們知道有很多種方法可以用于計(jì)時(shí):

1.time函數(shù):返回當(dāng)前時(shí)間戳,使用time函數(shù)計(jì)時(shí)是獲取兩個(gè)節(jié)點(diǎn)各自的時(shí)間戳,然后計(jì)算其之間的差值,即為耗時(shí)時(shí)長(zhǎng)。

  • 優(yōu)點(diǎn):計(jì)算的是真實(shí)世界中的時(shí)間長(zhǎng)度,而且計(jì)時(shí)本身不消耗計(jì)算機(jī)資源,計(jì)算長(zhǎng)時(shí)間的程序優(yōu)勢(shì)較大;
  • 缺點(diǎn):time函數(shù)的時(shí)間獲取來(lái)源于計(jì)算機(jī)本身的時(shí)間,如果在計(jì)時(shí)途中計(jì)算機(jī)的時(shí)間發(fā)生變化,比如人為的調(diào)快一小時(shí),那么計(jì)時(shí)就會(huì)比正確的時(shí)間慢一個(gè)小時(shí)的時(shí)間。

2.perf_counter函數(shù):是time模塊中專門用于性能計(jì)時(shí)的函數(shù),具有高分辨率的時(shí)鐘,已測(cè)量短持續(xù)的時(shí)間。

  • 優(yōu)點(diǎn):是專門用于性能計(jì)時(shí)的函數(shù),精確度高,適合計(jì)算耗時(shí)短的程序;
  • 缺點(diǎn):專門用于計(jì)時(shí)的函數(shù),計(jì)時(shí)本身就會(huì)消耗計(jì)算機(jī)資源,所以計(jì)時(shí)過(guò)長(zhǎng)難免會(huì)有一定的影響;

3.process_time函數(shù):用于評(píng)測(cè)處理時(shí)間,計(jì)算內(nèi)核和用戶空間CPU時(shí)間之和,這個(gè)時(shí)間不包含程序阻塞的時(shí)間,比如time.sleep()、input()等。

優(yōu)點(diǎn):專門用于計(jì)算程序本身內(nèi)在的時(shí)間消耗,排除外來(lái)因素、提升系統(tǒng)本身效率、優(yōu)化程序使用;

import time


def loop():
    time.sleep(1)
    input('請(qǐng)輸入:')  # 這個(gè)位置人為數(shù)三秒回車執(zhí)行
    num = 10 ** 8
    for _ in range(num):
        pass
    time.sleep(1)


# time.time
start_time = time.time()
loop()
end_time = time.time()
print(start_time)  # 1640270620.4077902
print(end_time)  # 1640270628.1165576
print(end_time - start_time)  # 7.708767414093018

# time.perf_counter
start_time = time.perf_counter()
loop()
end_time = time.perf_counter()
print(start_time)  # 3e-07
print(end_time)  # 7.823952
print(end_time - start_time)  # 7.8239517

# time.process_time
start_time = time.process_time()
loop()
end_time = time.process_time()
print(start_time)  # 3.234375
print(end_time)  # 4.8125
print(end_time - start_time)  # 1.578125

除此之外,python3.7之后,新增了精確到納秒的函數(shù):

  • time.time_ns()
  • time.perf_counter_ns()
  • time.process_time_ns()

還有標(biāo)準(zhǔn)庫(kù)timeit用于程序的性能計(jì)時(shí)。

時(shí)間轉(zhuǎn)換示意圖

在上述的幾種類型中存在時(shí)間轉(zhuǎn)換的問(wèn)題,詳情和之間的關(guān)系可以參考下圖:

datetime時(shí)間模塊

import datatime

datatime模塊重新封裝了time模塊,提供更多的接口。

date類

date類專門用于描述日期,實(shí)例化對(duì)象時(shí)必須填入?yún)?shù),分別表示:年、月、日,返回datetime.date對(duì)象。

datetime.date(year, month, day)

from datetime import date

date_o = date(2022, 3, 1)

print(date_o)
print(type(date_o))

"""
結(jié)果:
2022-03-01
<class 'datetime.date'>
"""

常用屬性

屬性作用
yeardate對(duì)象表示的具體年份(實(shí)例化對(duì)象調(diào)用達(dá)到效果);
monthdate對(duì)象表示的具體月份(實(shí)例化對(duì)象調(diào)用達(dá)到效果);
daydate對(duì)象表示的具體日(實(shí)例化對(duì)象調(diào)用達(dá)到效果);
maxdate類能夠表示的最大日期;
mindate類能夠表示的最小日期;
resolutiondate類能夠表示的最小單位;

常用方法

注意,以下方法如果可以返回新的對(duì)象,使用對(duì)象調(diào)用時(shí),返回新的對(duì)象,原對(duì)象不變;如果根據(jù)對(duì)象值返回對(duì)應(yīng)的值,則使用類調(diào)用達(dá)不到目標(biāo)效果;

方法作用
today()返回本地日期對(duì)象;
fromtimestamp(time_stamp)給定時(shí)間戳返回日期對(duì)象;
replace(y, m, d)給定年月日返回日期對(duì)象;
timetuple()返回本地當(dāng)前時(shí)間元組time.struct_time對(duì)象;
weekday()返回星期序號(hào),星期一返回0;
isoweekday()返回星期序號(hào),星期一返回1;
isocalendar()返回元組,表示日期的年份、第幾周、第幾周之后的第幾天;
isoformat()返回時(shí)間字符串;
strftime()格式化日期,參考time.strftime();

time類

time類是datetime模塊中專門用于描述時(shí)間的類,四個(gè)參數(shù):hour、minute、second、microsecond默認(rèn)都為0。

datetime.time(hour=0, minute=0, second=0, microsecond=0)

from datetime import time

time_0 = time()

print(time_0)
print(type(time_0))

"""
結(jié)果:
00:00:00
<class 'datetime.time'>
"""

time的屬性和date類的屬性方法基本相同,可以參考使用;

datetime類

相同于datetime兩個(gè)類的結(jié)合,使用基本相同;

timedelta類

timedelta類用于時(shí)間運(yùn)算,類的參數(shù)有datetime模塊支持的所有時(shí)間單位,使用其它的時(shí)間和日期對(duì)象可以和timedelta對(duì)象進(jìn)行時(shí)間加減運(yùn)算,注意在實(shí)例化時(shí)使用關(guān)鍵字傳參;

from datetime import datetime
from datetime import timedelta

# 日期對(duì)象
datetime_o = datetime(2000, 10, 30, 14, 40, 6)
print(datetime_o)

# ## 假設(shè)我們要計(jì)算這個(gè)時(shí)間5天4小時(shí)23分6秒之后的時(shí)間

# 實(shí)例化 5天4小時(shí)23分6秒 的timedelta對(duì)象
timedelta_o = timedelta(days=5, hours=4, minutes=23, seconds=6)

# 將時(shí)間對(duì)象和timedelta對(duì)象相加
datetime_o += timedelta_o
print(datetime_o)

"""
結(jié)果:
2000-10-30 14:40:06
2000-11-04 19:03:12
"""

到此這篇關(guān)于詳解Python常用標(biāo)準(zhǔn)庫(kù)之時(shí)間模塊time和datetime的文章就介紹到這了,更多相關(guān)Python time datetime內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論