python筆記-python關於時間的計算


一、時間的幾種格式:

1、時間戳(timestamp)

從1970年1月1日0點開始,到現在的秒數(以格林尼治時間為准)。

數據類型為'float',浮點數,小數

print(time.time())    # 返回的單位是秒不是毫秒
print(type(time.time()))                                 

 2、時間元組(Time tuple(time obj))

這是把年月日時分秒周日……作為一個元組

數據類型為‘time.struct_time’,元組

print(time.localtime())
print(type(time.localtime()))
print('年:', time.localtime()[0])
print('月:', time.localtime()[1])
print('日:', time.localtime()[2])
print('時:', time.localtime()[3])
print('分:', time.localtime()[4])
print('秒:', time.localtime()[5])
print('周幾:', time.localtime()[6])    # 0到6,0代表周一
print('第幾天:', time.localtime()[7])
print('夏令營:', time.localtime()[8])
print('-----------------------------')
print('年:', time.localtime().tm_year)
print('月:', time.localtime().tm_mon)
print('日:', time.localtime().tm_mday)
print('時:', time.localtime().tm_hour)
print('分:', time.localtime().tm_min)
print('秒:', time.localtime().tm_sec)
print('周幾:', time.localtime().tm_wday)
print('第幾天:', time.localtime().tm_yday)
print('夏令營:', time.localtime().tm_isdst)

3、時間格式(Datetime obj)

最准確的時間格式,還帶毫秒

類型為'datetime.datetime'

print(datetime.datetime.now())
print(type(datetime.datetime.now()))

4、時間字符串(string),就是字符串而已

time.strftime(fmt, [tupletime]):接收以時間元組,並返回以可讀字符串表示的時間,格式由fmt決定。

數據類型為‘str’,字符串

print(time.strftime('%Y%m%d%H%M%S'))

% y 兩位數的年份表示(00 - 99)

% Y 四位數的年份表示(000 - 9999) 

% m 月份(01 - 12)

% d 月內中的一天(0 - 31) 

% H 24小時制小時數(0 - 23)

% I 12小時制小時數(01 - 12)

% M 分鍾數(00 = 59)

% S 秒(00 - 59)

% a 本地簡化星期名稱

% A 本地完整星期名稱 

% b 本地簡化的月份名稱 

% B 本地完整的月份名稱 

% c 本地相應的日期表示和時間表示 

% j 年內的一天(001 - 366)

% p 本地A.M.或P.M.的等價符

% U 一年中的星期數(00 - 53)星期天為星期的開始

% w 星期(0 - 6),星期天為星期的開始 

% W 一年中的星期數(00 - 53)星期一為星期的開始 

% x 本地相應的日期表示 

% X 本地相應的時間表示

% Z 當前時區的名稱

% % % 號本身

5、總結

# 時間字符串,就是一個字符串,不方便進行計算,首先棄用。

# 時間戳,是個浮點數,也不方便進行計算,也棄用。

# 時間元組,是個元組,不能直接存入數據庫,還是棄用。

# 時間格式,這是最基本的格式,優先選用。

# time模塊,是以時間戳為基礎的。

# datetime模塊,是以時間格式為基礎的。

二、time模塊

time模塊中時間表現的形式主要有三種:

  • timestamp:時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量
  • struct_time:時間元組,共有九個元素
  • format_time:格式化時間,已格式化的結構使時間更具可讀性,包括自動化格式和固定格式

1、時間格式轉換圖:

2、生成時間戳timestamp

import time
print(time.time())           

 3、生成時間元組struct_time

import time
print(time.localtime())

4、時間戳轉換為時間元組

# 本地時間
import
time print(time.localtime(time.time())) print(time.localtime(1556348505))
# 格林威治時間
import
time print(time.gmtime(time.time())) print(time.gmtime(1556348505))

5、時間元組轉換為時間戳

import time
print(time.mktime(time.localtime()))
print(time.mktime(time.localtime(1556348505)))
print(time.mktime((2018,5,27,1,5,27,6,147,-1)))  # 人造時間元組轉換為時間戳

6、生成格式化時間

import time
print(time.strftime("%Y-%m-%d %H:%M:%S"))
print(time.strftime("%Y-%m-%d %X"))  # %X:本地相應的時間表示

7、時間元組轉換為格式化時間

import time
timStamp = 1556348505   # 需要轉換的時間戳
struct_time = time.localtime(timStamp)  # 時間戳轉換為時間元組
print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time))  # 時間元組轉換為格式化時間
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 本地時間的時間元組轉換為格式化時間

8、格式化時間轉換為時間元組

import time
print(time.strptime("2022-04-07 11:12:04", "%Y-%m-%d %H:%M:%S"))

9、生成固定格式的時間表示形式

time.asctime():接受時間元組並返回一個可讀的形式為"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18時07分14秒)的24個字符的字符串。

  語法:time.asctime([t]))

  參數:t為9個元素的元組或者通過函數 gmtime() 或 localtime() 返回的時間值。

time.ctime():把一個時間戳(按秒計算的浮點數)轉化為time.asctime()的形式。 如果參數未給或者為None的時候,將會默認time.time()為參數。它的作用相當於 asctime(localtime(secs))。

  語法:time.ctime([ sec ])

  參數:sec為要轉換為字符串時間的秒數。

import time
print(time.asctime())
print(time.ctime())
print(time.asctime(time.localtime()))   # 本地時間
print(time.asctime(time.gmtime()))    # 格林威治時間
timeStamp = 1556348505
struct_time = time.localtime(timeStamp)
print(time.asctime(struct_time))
print(time.ctime(timeStamp))

三、datetime模塊

datetime模塊定義了六個類,分別為:

  • datetime.date:表示日期的類,常用的屬性是year、month、day
  • datetime.time:表示時間的類,常用的屬性是hour、minute、second、microsecond
  • datetime.datetime:表示日期時間的類
  • datetime.timedelta:表示兩個date、time、datetime實例之間的時間間隔
  • datetime.tzinfo:時區相關信息對象的抽象基類,他們由datetime和time類使用,以提供自定義時間而調整
  • datetime.timezone:python3.2新增的功能,實現tzinfo抽象基類的類,表示與UTC的固定偏移量

1、date類

date類有三個參數,datetime.date(year,month,day),返回year-month-day

① 靜態方法和字段

from datetime import date
print(date.max)  # date對象所能表示的最大日期
print(date.min)  # date對象所能表示的最小日期
print(date.resolution)  # date對象所表示日期的最小單位,這里是天
print(date.today())   # 返回一個表示當前本地日期的date對象
print(date.fromtimestamp(1556348505))  # 根據給定的時間戳,返回一個date對象

② 方法和屬性

from datetime import date
# d1 = date.today()   # 返回一個表示當前本地日期的date對象
d1 = date(2022,4,7)  # date對象
print(d1.year)  #
print(d1.month)  #
print(d1.day)  #
print(d1.replace(2021, 1, 12))  # 生成一個新的日期對象,用參數指定的年,月,日代替原有對象中的屬性。(原有對象仍保持不變)
print(d1.timetuple())  # 返回日期對應的struct_time
print(d1.weekday())  # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此類推
print(d1.isoweekday())  # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此類推
print(d1.isocalendar())  # 返回格式如(年,第幾周,周的第幾天)的元組
print(d1.isoformat())  # 返回格式如'YYYY-MM-DD’的字符串
print(d1.strftime("%Y-%m-%d %H:%M:%S"))

2、time類

類的定義:class datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ) 。hour為必須參數,其他為可選參數

① 靜態方法和字段

from datetime import time
print(time.max)  # time類能表示的最大時間
print(time.min)  # time類能表示的最小時間
print(time.resolution)  # 時間的最小單位,這里是1微妙

② 方法和屬性

from datetime import time

d1 = time(16,33,7,24)  # time對象
print(d1.hour)  #
print(d1.minute)  #
print(d1.second)  #
print(d1.microsecond)  # 微秒
print(d1.tzinfo)  # 返回傳遞給time構造方法的tzinfo對象,如果該參數未給出,則返回None
print(d1.replace(10))  # 創建一個新的時間對象,用參數指定的時、分、秒、微秒代替原有對象中的屬性(原有對象仍保持不變)
print(d1.isoformat())  # 返回型如"HH:MM:SS"格式的字符串表示
print(d1.strftime("%Y-%m-%d %H:%M:%S"))

3、datetime類

datetime類的定義:class datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ),year, month 和 day是必須要傳遞的參數

① 靜態方法和字段

from datetime import datetime
from datetime import date
from datetime import time

print(datetime.datetime(2022, 4, 7, 18, 30, 30)) # datetime對象
print(datetime.today()) # 返回一個表示當前本地時間的datetime對象 print(datetime.now()) # 返回一個表示當前本地時間的datetime對象,如果提供了參數tz(datetime.now([tz]),則獲取tz參數所指時區的本地時間 print(datetime.utcnow()) # 返回一個當前utc時間的datetime對象(格林威治時間) print(datetime.fromtimestamp(1556348505)) # 根據時間戮創建一個datetime對象,參數tz指定時區信息;(datetime.fromtimestamp(timestamp[, tz])) print(datetime.utcfromtimestamp(1556348505)) # 根據時間戳創建一個datetime對象(格林威治時間) print(datetime.combine(date.today(), time(18, 10, 6))) # 根據date和time,創建一個datetime對象 print(datetime.strptime("2022-04-07 18:11:33", "%Y-%m-%d %H:%M:%S")) # 將格式字符串轉換為datetime對象

②方法和屬性

from datetime import datetime

dt = datetime.now()  # datetime對象    print(dt.timestamp()) # 獲取時間戳,等同於time模塊的time.time()
print(dt.year)  #
print(dt.hour)  #
print(dt.date())  # 獲取date對象
print(dt.time())  # 獲取time對象
print(dt.replace(2002, 2))  # 生成並返回一個新的datetime對象,如果所有參數都沒有指定,則返回一個與原datetime對象相同的對象
print(dt.timetuple())  # 返回datetime對象對應的tuple(不包括tzinfo)
print(dt.weekday())   # 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此類推
print(dt.isoweekday())  # 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此類推
print(dt.isocalendar())  # 返回格式如(年,第幾周,周的第幾天)的元組
print(dt.isoformat())
print(dt.ctime())  #     等價於time模塊的time.ctime(sec)
print(dt.strftime("%Y-%m-%d %H:%M:%S"))

4、timedelta類,時間加減

timedelta對象表示兩個不同時間之間的差值。如果使用time模塊對時間進行算術運行,只能將字符串格式的時間 和 struct_time格式的時間對象 先轉換為時間戳格式,然后對該時間戳加上或減去n秒,最后再轉換回struct_time格式或字符串格式,這顯然很不方便。而datetime模塊提供的timedelta類可以讓我們很方面的對datetime.date, datetime.time和datetime.datetime對象做算術運算,且兩個時間之間的差值單位也更加容易控制。使用timedelta可以很方便的在日期上做天days,小時hour,分鍾,秒,毫秒,微妙的時間計算,如果要計算月份則需要另外的辦法。

類定義:class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)

datetime.timedelta():返回一個時間間隔對象,可以直接與datetime.datetime對象做加減操

datetime.timedelta().total_seconds():時間差中包含的總秒數

import datetime

print(datetime.timedelta(days=365).total_seconds())   # 一年包含的總秒數
print(datetime.datetime.now() + datetime.timedelta(3))  # 三天后
print(datetime.datetime.now() + datetime.timedelta(-3))  # 三天前
print(datetime.datetime.now() + datetime.timedelta(hours=3))  # 三小時后
print(datetime.datetime.now() + datetime.timedelta(hours=3, seconds=30))  # 三小時三十秒后
print(datetime.date(2022, 3, 15) + datetime.timedelta(10))  # 2022年3月15日后十天
print(datetime.datetime(2022, 4, 7, 18, 30, 30) + datetime.timedelta(days=10, hours=1))  # 2022年4月7日 18:30:30秒后十天一個小時
print(datetime.datetime.now().date() + datetime.timedelta(days=1))   # 一天后

print(datetime.datetime.now() + datetime.timedelta(weeks=1))  # 當前日期為2022年4月8日,weeks為1則表示一周即7天

5、datetime常用操作

①datetime轉字符串  -------strftime()函數

兩種寫法:datetime.datetime.strftime(datatime對象,格式化的字符串)  或  datatime對象.strftime(格式化的字符串)

備注:若格式化的字符串中含中文,需使用format方式表示

import datetime

print(datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
print(datetime.datetime.strftime(datetime.datetime.now(), "%Y{}%m{}%d{} %H{}%M{}%S{}").format('', '', '', '', '', ''))
print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
print(datetime.datetime.now().strftime("%Y{}%m{}%d{} %H{}%M{}%S{}").format('', '', '', '', '', ''))

 ②字符串轉datetime  ------strptime()函數

寫法:datetime.datetime.strptime(時間字符串,格式化的字符串)

import datetime

time1 = datetime.datetime.strptime('2022-04-07 21:02:47', "%Y-%m-%d %H:%M:%S")
print(time1, type(time1))
time2 = datetime.datetime.strptime("2024年11月02日 13時50分03秒", "%Y年%m月%d日 %H時%M分%S秒")
print(time2,type(time2))

③時間差操作  ------timedelta()

可加入的參數:
weeks=0 周數,數字1表示七天;
days=0 天數;
hours=0 小時數;
minutes=0 分鍾數;
seconds=0 秒數;
milliseconds=0 毫秒數,千分之一秒;
microseconds=0 微秒數;百萬分之一秒.

具體見上方timedelta

④時間戳操作

import datetime

timeStamp = datetime.datetime.now().timestamp()  # 獲取datetime對象的時間戳
print(timeStamp)
print(datetime.datetime.fromtimestamp(timeStamp))  # 由時間戳初始化datetime對象

四、計算過去時間和未來時間代碼

import datetime
import time

def get_date_time(days=0, hours=0, minutes=0, seconds=0, micro_seconds=0, date_format='%Y-%m-%d %H:%M:%S'):
    '獲取時間,之前的時間(day=-90代表往前推90天)或未來的時間(day=90代表往后推90天)'
    now_time = datetime.datetime.now()
    need_time = now_time + datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds,
                                              microseconds=micro_seconds)
    need_time = need_time.strftime(date_format)
    print(need_time)
    return need_time


def get_last_time(second):
    '獲取過去的時間,second是當前時間比過去相差的秒數'
    last = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time() - second))  # 當前時間之前推多少秒
    return last

 ——————————————————————

參考文章:https://www.cnblogs.com/haitaoli/p/10823403.html

       https://blog.csdn.net/gty931008/article/details/80254806


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM