天天看點

time & datetime & calendar 時間子產品time & datetime & calendar 時間子產品

time & datetime & calendar 時間子產品

time子產品

和時間有關系的我們就要用到時間子產品。在使用子產品之前,應該首先導入這個子產品。

#常用方法
1.time.sleep(secs=10) # 睡10秒
(線程)推遲指定的時間運作。機關為秒。
2.time.time() # 擷取目前時間戳
# 1616297183.1809
           

表示時間的三種方式

在Python中,通常有這三種方式來表示時間:時間戳、元組(struct_time)結構化時間、格式化的時間字元串:

(1)時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。我們運作“type(time.time())”,傳回的是float類型。

(2)格式化的時間字元串(Format String): ‘1999-12-06’

%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 目前時區的名稱
%% %号本身
           

(3)元組(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一年中第幾周,一年中第幾天等)

索引(Index) 屬性(Attribute) 值(Values)
tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(時) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第幾天) 1 - 366
8 tm_isdst(是否是夏令時) 預設為0

首先,我們先導入time子產品,來認識一下python中表示時間的幾種格式:

# 導入時間子產品
>>>import time

# 時間戳
>>>time.time()
1500875844.800804

# 時間字元串
>>>time.strftime("%Y-%m-%d %X")
'2017-07-24 13:54:37'
>>>time.strftime("%Y-%m-%d %H-%M-%S")
'2017-07-24 13-55-04'

# 時間元組,結構化時間:localtime将一個時間戳轉換為目前時區的struct_time
time.localtime() # 不傳值顯示目前時間
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
          tm_hour=13, tm_min=59, tm_sec=37, 
                 tm_wday=0, tm_yday=205, tm_isdst=0)
           

小結:時間戳是計算機能夠識别的時間;時間字元串是人能夠看懂的時間;元組則是用來操作時間的

幾種格式之間的轉換

time & datetime & calendar 時間子產品time & datetime & calendar 時間子產品
# 時間戳-->結構化時間
# time.gmtime(時間戳)    # UTC時間,與英國倫敦當地時間一緻
# time.localtime(時間戳) # 當地時間。例如我們現在在北京執行這個方法:與UTC時間相差8小時,UTC時間+8小時 = 中原標準時間 
>>>time.gmtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
>>>time.localtime(1500000000)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)

# 結構化時間-->時間戳 
# time.mktime(結構化時間) # 可以了解為maketimestamp
>>>time_tuple = time.localtime(1500000000)
>>>time.mktime(time_tuple)
1500000000.0
           
# 結構化時間-->字元串時間
# time.strftime("格式定義","結構化時間")  結構化時間參數若不傳,則顯示目前時間
>>>time.strftime("%Y-%m-%d %X") # str format time
'2017-07-24 14:55:36'
>>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
'2017-07-14'

# 字元串時間-->結構化時間
# time.strptime(時間字元串,字元串對應格式) 
>>>time.strptime("2017-03-16","%Y-%m-%d") # str parser time 字元串解析時間
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
>>>time.strptime("07/24/2017","%m/%d/%Y")
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)
           
time & datetime & calendar 時間子產品time & datetime & calendar 時間子產品
# 結構化時間 --> %a %b %d %H:%M:%S %Y串
# time.asctime(結構化時間) 如果不傳參數,直接傳回目前時間的格式化串
>>>time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
>>>time.asctime()
'Mon Jul 24 15:18:33 2017'

# 時間戳 --> %a %b %d %H:%M:%S %Y串
# time.ctime(時間戳)  如果不傳參數,直接傳回目前時間的格式化串
>>>time.ctime()
'Mon Jul 24 15:19:07 2017'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017' 
           
import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
                                       struct_time.tm_mday-1,struct_time.tm_hour,
                                       struct_time.tm_min,struct_time.tm_sec))
           

datetime子產品

datetime下常用的幾大類:

  • date
  • time
  • datetime
  • timedelta

date類

import datetime
import time

# 建立datetime.date對象
print(datetime.date(1, 2, 3)) # 傳入年月日, -> 0001-02-03
print(type(datetime.date(1, 2, 3))) # <class 'datetime.date'>

1. today # 目前日期
a = datetime.date.today() 
print(a) # 2021-03-18
print(a.year,a.month,a.day) # 2021 03 18

2. formtimestamp # 時間戳轉字元串格式時間
b = datetime.date.fromtimestamp(time.time()) 
print(b) # 2021-03-18

3. strftime # 轉換字元串格式
c = datetime.date.today().strftime('%Y%m%d') 
print(c) # 20210318
print(type(c)) # <class 'str'>

4. isoweekday # 傳回周幾
print(datetime.date.today().isoweekday()) # 7
print(type(datetime.date.today().isoweekday())) #<class 'int'>
           

time類

import datetime

# 建立date.time對象
print(datetime.time(1,2,3,4)) # 傳入時,分,秒,微妙 -> 01:02:03.000004
print(type(datetime.time(1,2,3,4))) # <class 'datetime.time'>
           

datetime類

import datetime

# 建立datetime.datetime對象
print(datetime.datetime(1,2,3,4,5,6,7)) # 0001-02-03 04:05:06.000007
print(type(datetime.datetime(1,2,3,4,5,6,7))) # <class 'datetime.datetime'>

1. now # 目前年月日,時分秒微妙
a = datetime.datetime.now()
print(a) # 2021-03-18 13:14:30.850040
print(a.date()) # 2021-03-18
print(a.time()) # 13:15:45.670478

2. combine # 拼接datetime.date和datetime.time對象
print(datetime.combine(a.date(),a.time())) #2021-03-18 13:16:52.324006

3. strptime # 将字元串轉換為datetime.datetime類
res = datetime.datetime.strptime('20200101010101','%Y%m%d%H%M%S')
print(res,type(res))

4. strftime # 将datetime對象轉成str format
# 使用上方3的res
t1 = str(res) 
print(t1,type(t1)) # 2020-01-01 01:01:01 <class 'str'>
t2 = res.strftime('%Y-%m-%d %H:%M:%S') # 注意這裡以datetime執行個體對象調用strftime()方法,接收一個fmt參數
print(t2,type(t2)) # 2020-01-01 01:01:01 <class 'str'>
print(t1 == t2) # True
print(t1 is t2) # False
           

timedelta類

# timedelta的應用

1. 需求: 擷取上個月第一天和最後一天
import datetime
# 擷取今天的月份,年份
month = datetime.date.today().month
year = datetime.date.today().year
print(month) # 3
# 本月第一天為
fday_month = datetime.date(year,month,1)
print(fday_month) # 2021-03-01
# 上月最後一天為
lday_lmonth = fday_month - datetime.timedelta(days=1)
print(lday_lmonth) # 2021-02-28

2. datetime對象之間計算差
# datetime同類型才能相加減
a = datetime.datetime(2020,1,1)
b = datetime.datetime.today()
print(b-a)
print(type(b-a)) # <class 'datetime.timedelta'>
print((b-a).days) # 445
print(type((b-a).days)) #<class 'int'>
print((b-a).seconds) # <class 'int'> 這裡的seconds是b-a time部分的折算成的seconds,不包括days部分

3. 計算8小時後的時間
print(datetime.datetime.now() + datetime.timedelta(hours=8))

4. 計算上周一和周日的日期
# 上周日
print(datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()))
# 上周一
print(datetime.date.today() - datetime.timedelta(days=datetime.date.today().isoweekday()+6))

5. 計算指定日期當月最後一天的日期和本月天數
import calendar
a = '202002'
print(a[-2:])
days = calendar.monthrange(int(a[:4]), int(a[-2:]))[-1]
# calendar.monthrange傳回元祖,元祖的第二個數字代表這個月有多少天
print(f'當月最後一天日期為{a + str(days)},本月一共{days}天')
# 方法2: 不借助calendar需要多加一層判斷計算最後一天
m = int(a[-2:])
if m != 12:
    ld = datetime.date(int(a[:4]),m + 1 ,1) - datetime.timedelta(days=1)
else:
    ld = datetime.date(int(a[:4]) + 1,1 ,1) - datetime.timedelta(days=1)
print(ld)
print(ld.day)
           

python中時間日期格式化符号

符号	說明
%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	目前時區的名稱
%%	%号本身
           

calendar

詳細參照如下連結

https://blog.csdn.net/y472360651/article/details/82291753