「關於python處理時間常用的庫,分別是time、datetime、calendar這三個庫,以下是整理總結的常用方法:
1、time庫
# 獲取本地時間戳,返回浮點數print(time.time()) # 1590921425.7660675# 獲取結構化時間,time.gmtime(時間戳),不傳參默認當前 UTC時間print(time.gmtime()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=10, tm_min=38, tm_sec=23, tm_wday=6, tm_yday=152, tm_isdst=0)# time.localtime(時間戳),不傳參默認當前時間print(time.localtime()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=18, tm_min=41, tm_sec=7, tm_wday=6, tm_yday=152, tm_isdst=0), type-->class# 結構時間-->時間戳print(time.mktime(time.localtime())) # 1590921819.0# 字符串時間;time.asctime(結構化時間),不傳參默認當前結構化時間print(time.asctime()) # Sun May 31 18:44:57 2020# time.ctime(時間戳),不傳參默認當前時間戳print(time.ctime()) # Sun May 31 18:47:23 2020# 結構化時間-->字符串時間 time.strftime('時間格式'[,結構化時間]),不傳參為默認當前時間'''格式化字符串 日期/時間說明 取值範圍%Y 年份 0000~9999%m 月份(數字) 01~12%B 月份(英文全稱) January~December%b 月份(英文縮寫) Jan~Dec%d 日期 01~31%A 星期(英文全稱) Monday~Sunday%a 星期(英文縮寫) Mon~Sun%H 小時(24小時制) 00~23%I 小時(12小時制) 01~12%p 上/下午 AM,PM%M 分鐘 00~59%S 秒 00~59%X 本地時間表示%w 星期(0-6),星期天為星期的開始'''print(time.strftime('%Y-%m-%d %H:%M:%S %A', time.localtime())) # 2020-05-31 19:10:19 Sundayprint(time.strftime('%X')) # 19:13:59# 字符串時間-->結構化時間;time.strptime('字符串時間'[,時間格式]),字符串時間必須和時間格式對應# 時間格式默認為 %a %b %d %H:%M:%S %Yprint(time.strptime('Thu Jun 1 10:10:10 2020')) # time.struct_time(tm_year=2020, tm_mon=6, tm_mday=1, tm_hour=10, tm_min=10, tm_sec=10, tm_wday=3, tm_yday=153, tm_isdst=-1)print(time.strptime('2020-06-01 16:04:08', '%Y-%m-%d %H:%M:%S')) # time.struct_time(tm_year=2020, tm_mon=6, tm_mday=1, tm_hour=16, tm_min=4, tm_sec=8, tm_wday=0, tm_yday=153, tm_isdst=-1)# 指定程序暫停時間;time.sleep(secs)time.sleep(0.1) # 程序暫停0.1秒2、datetime庫
相比較於time庫,datetime庫更加直觀、更易於調用。
datetime庫定義了五個類,分別是:
datetime.date: 表示日期的類datetime.time: 表示時間的類datetime.datetime: 表示日期時間的類datetime.timedelta:表示時間間隔,即兩個時間點的間隔datetime.tzinfo:時區的的相關信息from datetime import datetime'''注意只import datetime 如此是沒有.today()'''# 返回表示今天本地時間的datetime對象print(datetime.today()) # 2020-06-01 16:38:06.265554print(type(datetime.today())) # <class 'datetime.datetime'># 返回表示當前本地時間的datetime對象print(datetime.now()) # 2020-06-01 16:41:15.314717# 根據時間戳創建一個datetime對象print(datetime.fromtimestamp(time.time())) # 2020-06-01 16:42:34.630726# datetime對象操作dt = datetime.now()print(dt.date()) # 2020-06-01print(dt.time()) # 16:44:01.192386# 返回替換後的datetime對象print(dt.replace(year=2021, month=8, day=2)) # 2021-08-02 16:47:21.978268# 返回指定格式的datetime對象print(dt.strftime('%Y/%m/%d %H:%M:%S')) # 2020/06/01 16:49:12'''datetime.timedeltatimedelta主要用來實現時間的運算可以很方便的計算 天、分鐘、秒的時間計算'''from datetime import timedeltadt = datetime.now()dt1 = dt + timedelta(days=-1) # 昨天dt2 = dt - timedelta(days=1) # 昨天dt3 = dt + timedelta(days=1) # 明天dt4 = dt + timedelta(hours=10) # 10小時後print(dt1, dt2, dt3, dt4) # 2020-05-31 16:59:58.956540 2020-05-31 16:59:58.956540 2020-06-02 16:59:58.956540 2020-06-02 02:59:58.956540print(dt + timedelta(days=8, hours=8, minutes=20, seconds=100, milliseconds=100, microseconds=100)) # 2020-06-10 02:24:45.1564183、calendar庫
相較於前面兩個庫,calendar擁有更高的可視化程度
# calendar庫import calendar# 獲取指定年份的日曆字符串print(calendar.calendar(2020))
輸出:2020日曆# 獲取指定月份的日曆字符串print(calendar.month(2020, 6))''' June 2020Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30'''# 以列表形式返回每個月的總天數print(calendar.mdays) # [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]# 返回指定月份的第一天是周幾以及當月總天數print(calendar.monthrange(2020, 6)) # (0, 30) (周一, 30天)# 判斷閏年print(calendar.isleap(2020)) # TrueLast、一些習題
from datetime import datetimeimport calendarimport time''' 第一題:列印出當前距離2020年9月1日有多少天多少小時多少分多少秒 '''# 兩個日期之間的差為cha = datetime(2020, 9, 1, 16, 32) - datetime.now() # type <class 'datetime.timedelta'># 相差的天數days = cha.days# 相差的月數if days > 30: mons = days // 30# 整除 ds = days % 30# 取餘# print(days)# 方法一:分割cha為列表cha_list1 = str(cha).split()print(cha_list1) # ['91', 'days,', '5:34:54.688354']cha_list2 = cha_list1[2].split(':')print("兩個時間相差%d月%d天%d小時%d分鐘%d秒" % (mons ,ds, int(cha_list2[0]), int(cha_list2[1]), int(cha_list2[2][:2])))# 兩個時間相差91天5小時28分鐘1秒 兩個時間相差3月1天5小時4分鐘39秒# 方法二:# 相差的秒數remain_seconds = cha.seconds# 相差的小時數hours = remain_seconds // 3600# 相差的分鐘數minutes = remain_seconds % 3600 // 60# 相差的秒數seconds = remain_seconds % 60print("兩個時間相差%d月%d天%d小時%d分鐘%d秒" % (mons ,ds, hours, minutes, seconds)) # 兩個時間相差3月1天4小時41分鐘35秒''' 第二題:列印出20個月後的日期 '''# cur = datetime.now()defgetDate(cur, ms): year = cur.year # 當前年 month = cur.month # 當前月 day = cur.day # 當前天# 計算20個月之後的天數 total_month = month + ms # 總的月數 y_plus = total_month // 12# 需要增加的年數 new_month = total_month % 12# 新的月份 0,1,2……11# 月份為0if new_month == 0: y_plus -= 1 new_month = 12# 處理2月份的情況及新的月份為30天的情況if new_month == 2and calendar.isleap(year + y_plus): mdays = 29else: mdays = calendar.mdays[new_month]# 如果當前天數大於新月份總天數,不外乎兩種情況:1.2月 2.當前為31日,新月份總天數30日。這個時候月份加1if mdays < day: new_month += 1 day = day - mdaysreturn year+y_plus, new_month, daycur = datetime.now()new_date_tuple = getDate(cur, 20) # (2022, 2, 2)# 20個月後的日期new_date = cur.replace(new_date_tuple[0], new_date_tuple[1], new_date_tuple[2])print(new_date) # 2022-02-02 16:55:59.228952''' 第三題:列印出指定格式的日期 例如:2020年6月2日 星期二 17:08:32 '''# 星期*defgetWeek(w):if w == '1': week = '星期一'elif w == '2': week = '星期二'elif w == '3': week = '星期三'elif w == '4': week = '星期四'elif w == '5': week = '星期五'elif w == '6': week = '星期六'else: week = '星期日'return week# print(type(time.strftime('%w', time.localtime()))) # <class 'str'>w = time.strftime('%w', time.localtime())# print(getWeek(w))# 輸出指定格式print(time.strftime("%Y{}%m{}%d{} {} %H:%M:%S", time.localtime()).format('年', '月', '日', getWeek(w))) # 2020年06月02日 星期二 17:31:16''' 列印出當前距離指定日期差多少天 多少時 多少分 多少秒 '''defcha(year, month, day): a_datetime = datetime(year, month, day) - datetime.now() print('當前時間距%d年%d月%d日還有%d天%d時%d分%d秒' % (year, month, day, a_datetime.days, a_datetime.seconds//3600, a_datetime.seconds % 3600//60, a_datetime.seconds%60))cha(2020, 6, 3) # 當前時間距2020年6月3日還有0天6時11分29秒