天天看點

python:日期與時間之datetime子產品時間datetime子產品datetime.date類datetime.time類datetime.datetime類datetime.timedelta類補充月曆子產品拓展

時間

1、Python中最常見以及常用的幾種時間格式

   ⑴時間戳(timestamp):時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量

   ⑵時間元組(struct_time):共有九個元素組

   ⑶格式化時間(format time):可以格式化為固定或者自定義格式,增加可讀性,如2017-11-1

2、時區:世界标準時間UTC(格林威治天文時間)

3、中國時間為:UTC+8,表示東八區

datetime子產品

1、datetime子產品是time類的更新版,可以分别對date(日期)、time(時間)、datetime(日期時間)等三種單獨管理

    ⑴datetime子產品下定義了5個類:這裡所說的datetime是一個子產品(一個Python檔案),這個子產品下面包含了五個類

    ⑵其中3個類用于處理日期、時間、日期時間的:date類、time類、datetime類

    ⑶還有兩個類是用于處理時間間隔和時區:timedelta類和tzinfo類

2、datetime子產品定義了兩個常量:datetime.MINYEAR和datetime.MAXYEAR,分别表示datetime所能表示的最小、最大年份

    MINYEAR = 1

    MAXYEAR = 9999

3、datetime.datetime類的應用最為普遍且上面這些類型的對象都是不可變(immutable)的

4、datetime子產品下的類:

類名 調用方式       說明
datetime.date   from datetime import date 表示日期的類。常用的屬性有year, month, day
datetime.time from datetime import time 表示時間的類。常用的屬性有hour, minute, second, microsecond
datetime.datetime  from datetime import datetime 表示日期時間的類。date類和time類的綜合
datetime.timedelta from datetime import timedelta 表示時間間隔,即兩個時間點之間的長度
datetime.tzinfo  from datetime import tzinfo 與時區有關的相關資訊

datetime.date類

1、date對象由year年份、month月份及day日期三部分構成

    ⑴date對象:調用datetime.date類将相當于是建立了一個datetime.date類的執行個體對象

2、Python也是面向對象程式設計語言,是以針對類,就會有構造函數,該類的構造函數如下: 

構造函數

datetime.date類的構造函數如下: 

class datetime.date(year, month, day)

參數說明
1、year, month和day都是是必須參數
2、year:表示年,取值範圍[MINYEAR, MAXYEAR]
3、month:表示月,取值範圍[1, 12]
4、day:一月中第幾天,取值範圍[1, 指定年份的月份中的天數]
           

注:當值超過了取值範圍,則會觸發一個ValueError的異常

例1:初始化一個date對象

from datetime import date

#初始化一個date對象
date = date(2014,2,11)#隻能有年月日三個參數

print(date) #傳回一個date對象
print(type(date))

"""
2014-02-11
<class 'datetime.date'>
"""
           

注:

1、這個其實就是使用類中的構造函數__init__方法來執行個體化一個date對象

2、源碼:

class date:
    min: ClassVar[date]
    max: ClassVar[date]
    resolution: ClassVar[timedelta]

    def __init__(self, year: int, month: int, day: int) -> None: ...
           

datetime.date類的靜态屬性和方法

以下是datetime.date類的一些(類)靜态方法和(類)屬性:直接通過類名調用

類方法/屬性名稱  描述
date.max  date對象所能表示的最大日期:9999-12-31
date.min date對象所能表示的最小日志:00001-01-01
date.resolution date對象表示的日期的最小機關:天
date.today()  傳回一個表示目前本地日期的date對象
date.fromtimestamp(timestamp)  根據給定的時間戳,傳回一個date對象

例2:datetime.date類的靜态方法和屬性

from datetime import date

print("datetime.date類的類屬性max:",date.max)
print("datetime.date類的類屬性min:",date.min)
print("datetime.date類的類屬性resoluation:",date.resolution)
print("datetime.date類的靜态方法_today",date.today())
print("datetime.date類的靜态方法_fromtimestamp",date.fromtimestamp(1117937981))

"""
datetime.date類的類屬性max: 9999-12-31
datetime.date類的類屬性min: 0001-01-01
datetime.date類的類屬性resoluation: 1 day, 0:00:00
datetime.date類的靜态方法_today 2020-08-27
datetime.date類的靜态方法_fromtimestamp 2005-06-05
"""
           

datetime.date類對象的方法和屬性

1、一個類中肯定會定義很多類方法和類屬性等:我們執行個體化一個date類或傳回一個date類對象後,就可以使用

    ⑴類外:"執行個體名.類方法名"或"執行個體名.類屬性名"來調用類方法和類屬性。這裡肯定是類外調用

    ⑵類中:"self.類方法名"或"類名.類屬性"

    ⑶這個是Python類的通用方法、屬性

2、以下方法和屬性需要通過:datetime.date類的執行個體對象調用(date對象)

對象方法/屬性名稱 描述(d表示執行個體對象)
d.year
d.month
d.day
d.isoformat() 傳回格式如'YYYY-MM-DD'的字元串
d.strftime(format) 傳入任意格式符,可以輸出對應格式的日期表示形式
d.replace(year=,month=,day=)  生成一個新的日期對象,用參數指定的年,月,日代替原有對象中的屬性(原有對象仍保持不變)
d.timetuple()  傳回時間元組struct_time格式的日期
d.toordinal() 傳回日期是是自 0001-01-01 開始的第多少天
d.weekday()     傳回日期是星期幾,[0, 6],0表示星期一
d.isoweekday() 傳回日期是星期幾,[1, 7], 1表示星期一
d.isocalendar() 傳回一個元組,格式為:(year,week,weekday)。week:一年中的第幾周,weekday:目前日期是星期幾

例3: 執行個體對象的屬性

from datetime import date

now = date.today()
#now = date(2020,12,12)
print("目前時間的date對象為:",now) 
print(type(now))#傳回一個date對象

print("執行個體對象date的year屬性:",now.year)
print("執行個體對象date的month屬性:",now.month)
print("執行個體對象date的day屬性:",now.day)

"""
目前時間的date對象為: 2020-08-27
<class 'datetime.date'>
執行個體對象date的year屬性: 2020
執行個體對象date的month屬性: 8
執行個體對象date的day屬性: 27
"""
           

例3_1:執行個體對象的replace()方法

from datetime import date

today = date.today()  #傳回目前日期

print("目前日期為:",today)

new_day = today.replace(2019,1,1) #新生成一個date對象:年月日
new_day1 = today.replace(2019,1) #新生成一個date對象:年月
new_day2 = today.replace(month=2,day=2) #新生成一個date對象:月日
print("新生成的date對象為:",new_day)
print("新生成的date1對象為:",new_day1)
print("新生成的date2對象為:",new_day2)

print("舊的date對象不變:",today)

"""
目前日期為: 2020-08-27
新生成的date對象為: 2019-01-01
新生成的date1對象為: 2019-01-27
新生成的date2對象為: 2020-02-02
舊的date對象不變: 2020-08-27
"""
           

例3_2:執行個體對象的strftime()和isoformat()方法

from datetime import date

today = date.today()  #傳回目前日期
print("目前日期為:",today)

new_day = today.strftime("%Y/%m/%d")    #重新格式化日期格式:傳回自定義格式的時間字元串
new_day1 = today.strftime("%Y{0}%m{1}%d{2}").format("年","月","日")
print(new_day)
print(new_day1)

new_day2 = today.isoformat()#再次重新格式化日期格式:這個方法是寫死了格式的-
print(new_day2)

"""
目前日期為: 2020-08-27
2020/08/27
2020年08月27日
2020-08-27
"""
           

例3_3:執行個體對象的timetuple()方法

from datetime import date
import time

today = date.today()    #傳回目前日期
print("目前日期為:",today)

new_day = today.timetuple()
print(new_day)
#這裡可以使用time類下面的方法将一個時間元組的值轉化為字元串型的時間值
print(time.strftime("%Y-%m-%d %H:%M:%S", new_day))

"""
目前日期為: 2020-08-27
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=240, tm_isdst=-1)
2020-08-27 00:00:00
"""
           

datetime.time類

datetime子產品下的time類由:hour小時、minute分鐘、second秒、microsecond毫秒和tzinfo五部分組成

構造函數

datetime.time類的構造函數如下:

class datetime.time(hour, minute, second, microsecond, tzinfo)

參數說明:
1、hour為必須參數,其他為可選參數。各參數的取值範圍為:
2、hour:表示小時,取值範圍[0, 23]
3、minute:表示分鐘,取值範圍[0, 59]
4、second:表示秒數,取值範圍[0, 59]
5、microsecond:表示毫秒數,取值範圍[0, 1000000]
6、tzinfo:表示目前時區,tzinfo的子類對象,如timezone類的執行個體
           

例4:

from datetime import time

Time = time(5)  #這裡也是相當于執行個體化一個time
print("隻有小時數:",Time)

Time1 = time(hour=5,minute=12,second=12,microsecond=121212)
print("完整:",Time1)
print(type(Time1))  #傳回一緻time

"""
隻有小時數: 05:00:00
完整: 05:12:12.121212
<class 'datetime.time'>
"""
           

datetime.time類的靜态屬性

1、以下是datetime.time類的一些(類)靜态屬性:直接通過類名調用

類方法/屬性名稱 描述
time.max time類所能表示的最大時間:time(23, 59, 59, 999999)
time.min  time類所能表示的最小時間:time(0, 0, 0, 0)
time.resolution 時間的最小機關,即兩個不同時間的最小內插補點:1微秒

例5:

from datetime import time

print(time.max)
print(time.min)
print(time.resolution)

"""
23:59:59.999999
00:00:00
0:00:00.000001
"""
           

datetime.time類對象的方法和屬性

1、也是執行個體化一個類對象後(time類)或傳回一個time類對象後,通過其執行個體名來調用

2、以下方法和屬性需要通過:datetime.time類的執行個體對象調用

對象方法/屬性名稱  描述
t.hour
t.minute   分
t.second  秒
t.microsecond  微秒
t.isoformat() 傳回一個‘HH:MM:SS.%f’格式的時間字元串
t.strftime() 傳回指定格式的時間字元串,與time子產品的strftime(format, struct_time)功能相同
t.tzinfo   時區資訊
t.replace(hour,minute,second,microsecond,tzinfo) 建立一個新的時間對象,用參數指定的時、分、秒、微秒代替原有對象中的屬性(原有對象仍保持不變)

例6:time對象常用屬性

from datetime import time

Time = time(22, 23, 23, 111)  #執行個體化一個time對象:Time
print("時間:",Time)

print("執行個體對象的hour屬性:",Time.hour)
print("執行個體對象的minute屬性:",Time.minute)
print("執行個體對象的second屬性:",Time.second)
print("執行個體對象的microsecond屬性:",Time.microsecond)
print("執行個體對象的tzinfo屬性:",Time.tzinfo) #執行個體化時沒有指明所用時區,是以為None

"""
#time類就沒有傳回目前時間的屬性或方法了?
時間: 22:23:23.000111
執行個體對象的hour屬性: 22
執行個體對象的minute屬性: 23
執行個體對象的second屬性: 23
執行個體對象的microsecond屬性: 111
執行個體對象的tzinfo屬性: None
"""
           

例6_1:

from datetime import time

Time = time(22, 23, 3, 111)  #執行個體化一個time對象:Time
print("時間:",Time)

#strftime()方法:根據傳入的格式來輸出時間字元串
print("指定格式:",Time.strftime("%H-%M-%S.%f"))
print("指定格式:",Time.strftime("%H{0}%M{1}%S{2}").format("時","分","秒")) #可以不格式化毫秒

#isoformat():輸出固定格式的字元串
print("固定格式:",Time.isoformat())

#replace():生成新的time對象
print("生成新的time對象:",Time.replace(hour=3))
print("生成新的time對象:",Time.replace(3,3,3,33))

"""
時間: 22:23:03.000111
指定格式: 22-23-03.000111
指定格式: 22時23分03秒
固定格式: 22:23:03.000111
生成新的time對象: 03:23:03.000111
生成新的time對象: 03:03:03.000033
"""
           

datetime.datetime類

1、datetime子產品下的datetime類是Python處理日期和時間的标準庫。datetime類是date類與time類的結合體,包括date類與time類的所有資訊

構造函數

datetime.datetime類的構造函數如下:

datetime.datetime (year, month, day, hour, minute, second, microsecond, tzinfo)
           

例7:執行個體化一個datetime對象

from datetime import datetime

now = datetime(2020,8,27,12,12,12,1111)#執行個體化一個datetime對象
print("目前日期為:",now)
print(type(now))

now1 = datetime(year=2020,month=8,day=27) #年月日為必填參數,其餘未傳入時預設為0
print("目前日期為:",now1)

"""
目前日期為: 2020-08-27 12:12:12.001111
<class 'datetime.datetime'>
目前日期為: 2020-08-27 00:00:00
"""
           

datetime.datetime類的靜态屬性

1、以下是datetime.datetime類的一些(類)靜态方法和屬性:直接通過類名調用

類屬性、類方法 描述
datetime.today()  傳回一個表示目前本地時間的datetime對象
datetime.now([tz])  傳回一個表示目前本地時間的datetime對象,如果提供了參數tz,則擷取tz參數所指時區的本地時間
datetime.utcnow() 傳回一個目前utc時間的datetime對象;#格林威治時間
datetime.fromtimestamp(timestamp[, tz])  根據時間戮建立一個datetime對象,參數tz指定時區資訊
datetime.utcfromtimestamp(timestamp) 根據時間戮建立一個datetime對象(utc)
datetime.combine(date, time)   根據date和time,建立一個datetime對象
datetime.strptime(date_string, format) 将格式字元串轉換為datetime對象

datetime.datetime類方法

1、直接通過類名調用

today()

1、today()方法的文法如下:datetime.datetime.today()

2、此文法中datetime.datetime指的是datetime子產品中的datetime類

3、傳回值:傳回一個表示目前本地時間的datetime對象

例8:

import datetime

now = datetime.datetime.today()
print("目前時間為:",now)
print(type(now))

"""
目前時間為: 2020-08-27 14:12:01.679698
<class 'datetime.datetime'>
"""
           

例8_1:

from datetime import datetime

now = datetime.today()
print("目前時間為:",now)

#目前時間為: 2020-08-27 14:11:06.903158
           

now()

1、now()方法的文法如下:datetime.datetime.now([tz])

2、此文法中datetime.datetime指的是datetime子產品中的datetime類

3、如果提供參數tz,就擷取tz參數所指時區的本地時間(now是本地時間,可以認為是你電腦現在的時間)

4、傳回值:傳回目前指定的本地時間,一個datetime對象

例9:

from datetime import datetime

print("目前時間為:",datetime.now())

#目前時間為: 2018-08-19 19:07:33.719778

           

utcnow()

1、utcnow()方法的文法如下:datetime.datetime.utcnow()

2、此文法中datetime.datetime指的是datetime子產品中的datetime類

3、傳回值:傳回一個目前utc時間的datetime對象

例10:

from datetime import datetime

print("目前時間為:",datetime.utcnow())
print("目前時間為:",datetime.now())

"""
目前時間為: 2020-08-27 06:15:31.312575
目前時間為: 2020-08-27 14:15:31.312575
"""
           

fromtimestamp()

1、fromtimestamp()方法的文法如下:datetime.datetime.fromtimestamp(timestamp[,tz]

2、此文法中datetime.datetime指的是datetime子產品中的datetime類

3、參數tz表示指定的時區資訊,參數timestamp表示需要轉換的時間戳

4、傳回值:将一個時間戳形式的時間轉換為可讀形式,傳回一個datetime對象

例11:

from datetime import datetime
import time

now = time.time()
print("目前時間戳:",now)

Time = datetime.fromtimestamp(now)
print("目前時間為:",Time)

print("目前時間為:",datetime.fromtimestamp(1583355285))

"""
目前時間戳: 1598509379.9748611
目前時間為: 2020-08-27 14:22:59.974861
目前時間為: 2020-03-05 04:54:45
"""
           

combine()

1、combine()方法的文法如下:datetime.datetime.combine(date, time)

2、此文法中datetime.datetime指的是datetime子產品中的datetime類

3、參數date表示一個date對象,參數time表示一個time對象

4、傳回值:根據date和time,建立一個datetime對象

例12:

import datetime

Date = datetime.date.today()
print("目前日期為:",Date)

Time = datetime.time(12,12,12,122)
print("目前時間為:",Time)

now = datetime.datetime.combine(Date,Time)
print("目前日期時間為:",now)

"""
目前日期為: 2020-08-27
目前時間為: 12:12:12.000122
目前日期時間為: 2020-08-27 12:12:12.000122
"""
           

strptime()

1、作用:将時間型字元串格式化為datetime對象

2、strptime()方法的文法如下:datetime.datetime.strptime(date_string,format)

3、此文法中datetime.datetime指的是datetime子產品中的datetime類

4、參數date_string指日期字元串,format為格式方式

5、傳回值:傳回一個datetime對象

例13:

from datetime import datetime

"""
1、strptime()方法将一個字元串時間格式化為一個datetime對象
2、目标格式中傳入了.%f屬性時,傳入的時間字元串中必須含有毫秒(必須為對應關系)
3、目标格式中未傳入了.%f屬性時,傳入的時間字元串中不能含有毫秒(必須為對應關系)
"""
time1 = datetime.strptime("2018-08-19 19:23:57.1111", "%Y-%m-%d %H:%M:%S.%f")
print(time1)
print(type(time1))

time2 = datetime.strptime("2018-08-19 19:23:57", '%Y-%m-%d %H:%M:%S')
print(time2)

"""
2018-08-19 19:23:57.111100
<class 'datetime.datetime'>
2018-08-19 19:23:57
"""
           

例13_1:

import datetime

input_date = str(input("-----:"))

try:
    date = datetime.datetime.strptime(input_date, '%Y-%m-%d %H:%M:%S')
    print("目前輸入的時間值為:", date)
except:
    print("傳入的時間值錯誤")

print("時間值校驗完成")

"""
-----:2020-11-15 13:22:23
目前輸入的時間值為: 2020-11-15 13:22:23
時間值校驗完成

-----:2020-11-15 13:22:23.000
傳入的時間值錯誤
時間值校驗完成

-----:2020/11/15 13:22:23
傳入的時間值錯誤
時間值校驗完成
"""
           

datetime類對象的方法和屬性

1、執行個體化一個類對象(datetime類)或傳回一個datetime類對象後,通過其執行個體名來調用

2、以下方法和屬性需要通過:datetime.datetime類的執行個體對象調用

3、datetime.datetime類的類方法或屬性傳回的如果是一個datetime對象,那這個datetime對象又有自己的方法或屬性

    ⑴一般而言,在Python中傳回值是一個對象,那麼這個對象都有自己的方法或屬性

對象方法 描述(dt表示datetime類的執行個體對象)
dt.year, dt.month, dt.day 年、月、日
dt.hour, dt.minute, dt.second 時、分、秒
dt.microsecond, dt.tzinfo 微秒、時區資訊
dt.date() 擷取datetime對象對應的date對象
dt.time() 擷取datetime對象對應的time對象, tzinfo 為None
dt.timetuple() 傳回datetime對象對應的tuple(不包括tzinfo)
dt.timetz() 擷取datetime對象對應的time對象,tzinfo與datetime對象的tzinfo相同
dt.utctimetuple() 傳回datetime對象對應的utc時間的tuple(不包括tzinfo)
dt.toordinal() 同date對象
dt.weekday() 同date對象
dt.isocalendar() 同date對象
dt.isoformat([sep])     傳回一個‘%Y-%m-%d
dt.ctime()     等價于time子產品的time.ctime(time.mktime(d.timetuple()))
dt.strftime(format) 傳回指定格式的時間字元串
dt.replace(year, month, day, hour,minute,second, microsecond, tzinfo) 生成并傳回一個新的datetime對象

strftime()

1、作用:将datetime對象格式化為字元串

2、strftime()方法的文法如下:dt.strftime(format)

3、此文法中datetime.datetime指的是datetime子產品中的datetime類

4、dt表示datetime類的執行個體對象,參數format為格式化方式

3、傳回值:傳回一個時間字元串

例14:

from datetime import datetime

"""
1、strftime方法将一個datetime對象格式化為一個字元串時間
2、目标格式中傳入了.%f屬性時,輸出的時間值中将會有毫秒
3、目标格式中未傳入了.%f屬性時,輸出的時間值中将不會有毫秒
"""
now = datetime.now()
print("目前時間",now)
print(type(now))

time1 = now.strftime("%Y-%m-%d %H:%M:%S.%f")
print(time1)

time2 = now.strftime('%Y-%m-%d %H:%M:%S')
print(time2)
print(type(time1))

"""
目前時間 2020-08-27 14:48:01.711876
<class 'datetime.datetime'>
2020-08-27 14:48:01.711876
2020-08-27 14:48:01
<class 'str'>
"""
           

例15:

import datetime,time

today = datetime.datetime.now()

print(today.year)
print(today.hour)
print(today.date())
print(today.time())


'''
上面函數的輸出結果為:
2018
17
2018-08-25
17:01:33.202716
'''
           

datetime.timedelta類

1、timedelta對象表示兩個不同時間之間的內插補點

    ⑴datetime.timedelta對象代表兩個時間之間的時間差,兩個date、time或datetime對象相減就可以傳回一個timedelta對象

2、如果使用time子產品對時間進行算術運作,隻能将字元串格式的時間和struct_time格式的時間對象先轉換為時間戳格式

    ⑴然後對該時間戳加上或減去n秒,最後再轉換回struct_time格式或字元串格式,這顯然很不友善

3、而datetime子產品提供的timedelta類可以讓我們很方面的對datetime.date, datetime.time和datetime.datetime對象做算術運算

    ⑴且兩個時間之間的內插補點機關也更加容易控制。這個內插補點的機關可以是:天、秒、微秒、毫秒、分鐘、小時、周

構造函數

datetime.timedelta類的構造函數如下:

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
#天、秒、微秒、毫秒、分鐘、小時、周
           

注:

1、所有參數都是預設參數,預設值為0

2、參數的值可以是整數或浮點數,也可以是正數或負數(正數表示加,負數表示減)

3、針對時間存儲,timedelta内部隻能存儲days,seconds,microseconds,其他參數的值會自動按如下規則進行轉換:

    ⑴millisecond毫秒)轉換成1000 microseconds(微秒)

    ⑵minute轉換成60 seconds

    ⑶hour轉換成3600 seconds

    ⑷week轉換成7 days

例16:

from datetime import timedelta

# 執行個體化一個時間段值:1周2天3小時4分鐘5秒777毫秒666微秒
time1 = timedelta(days=2, seconds=5, microseconds=666, milliseconds=777, minutes=4, hours=3, weeks=1)
print(time1)
print(type(time1))

time2 = timedelta(days=2, hours=1)
print(time2)


"""
9 days, 3:04:05.777666
<class 'datetime.timedelta'>
2 days, 1:00:00
感覺其作用就是執行個體化一個時間段值,然後可能根據這個時間段值來進行時間的加減
"""
           

例16_1:日期時間差

import datetime

Date = datetime.datetime.today()
print("目前日期:",Date)

Date1 = datetime.datetime(2020,8,20,12,12,12)
print("過去日期為:",Date1)

d = Date - Date1  #這裡以datetime對象為例,date對象與time對象也是可以相減的
print("日期差為:",d)
print(type(d))

"""
目前日期: 2020-08-27 15:01:28.856253
過去日期為: 2020-08-20 12:12:12
日期差為: 7 days, 2:49:16.856253
<class 'datetime.timedelta'>
"""
           

例16_1:時間間隔

import datetime

#print(datetime.timedelta(365).total_seconds())  #一年中共有多少秒

today = datetime.datetime.now()
print("目前時間:",today)

three_day_later = today + datetime.timedelta(3)   #3天後
print(three_day_later)
print(type(three_day_later)) #還是一個datetime對象

three_day_befor = today - datetime.timedelta(days = 3)   #3天前
#three_day_befor = today + datetime.timedelta(-3)
print(three_day_befor)

three_hours_later = today + datetime.timedelta(hours=3)   #3小時後
print(three_hours_later)

new_day = today + datetime.timedelta(days=1,minutes=22,seconds=30,milliseconds=2)   #1天22分鐘30秒2毫秒後
print(new_day)


"""
目前時間: 2020-08-27 15:07:15.893238
2020-08-30 15:07:15.893238
<class 'datetime.datetime'>
2020-08-24 15:07:15.893238
2020-08-27 18:07:15.893238
2020-08-28 15:29:45.895238
"""
           

datetime.timedelta類的類屬性

1、以下是datetime.timedelta類的一些(類)屬性:直接通過類名調用

類屬性名稱   描述
timedelta.min  timedelta(-999999999)
timedelta.max  timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
timedelta.resolution  timedelta(microseconds=1)

datetime.timedelta類對象的方法和屬性

1、執行個體化一個類對象後(timedelta類)或傳回一個timedelta類對象後,通過其執行個體名來調用

2、以下方法和屬性需要通過:datetime.timedelta類的執行個體對象調用

執行個體方法/屬性名稱  描述(td表示timedelta類的執行個體對象)
td.days  天 [-999999999, 999999999]:傳回時間差的天部分
td.seconds  秒 [0, 86399]:傳回之間差的時分秒部分(轉換為秒傳回)
td.microseconds 微秒 [0, 999999]
td.total_seconds()  時間差中包含的總秒數
datetime.datetime.now()   傳回目前本地時間(datetime.datetime對象執行個體)
datetime.datetime.fromtimestamp(timestamp)   傳回指定時間戳對應的時間(datetime.datetime對象執行個體)
datetime.timedelta()     傳回一個時間間隔對象,可以直接與datetime.datetime對象做加減操作

例17:

from datetime import datetime, timedelta
 
future = datetime.strptime("2020-02-01 08:00:00", "%Y-%m-%d %H:%M:%S")
now = datetime.now()
 
TimeEquation = now - future
print(TimeEquation)            #傳回兩個時間差的天、時分秒部分:49 days, 5:58:56.887765
print(TimeEquation.days)    #隻傳回兩個時間差的天數部分:49
print(TimeEquation.seconds)    #隻傳回兩個時間差的時分秒部分(換算為秒傳回):21536=(5*60*60)+(58*60)+56
print(TimeEquation.seconds/60/60)#隻傳回兩個時間差的時分秒部分(換算為小時傳回):5.982222222222222=5+(59/60)
 
print(TimeEquation.total_seconds())
#傳回兩個時間差的總秒數(将相差天、時、分、秒都轉為秒):4255136.887765=(48*24*60*60)+(5*60*60)+(58*60)+56
 
"""
49 days, 5:58:56.887765
49
21536
5.982222222222222
4255136.887765
"""

           

補充

計算兩個時間的時間差

其本上常用的類有:datetime和timedelta兩個。它們之間可以互相加減。每個類都有一些方法和屬性可以檢視具體的值

    ⑴datetime可以檢視:天數(day),小時數(hour),星期幾(weekday())等

    ⑵timedelta可以檢視:天數(days),秒數(seconds)等

例18:

from datetime import datetime,timedelta

future = datetime.strptime("2019-02-01 08:00:00","%Y-%m-%d %H:%M:%S")
now = datetime.now()

TimeEquation = future - now      #計算時間差
#print(TimeEquation)              #145 days, 20:50:32.599774

hours = TimeEquation.seconds/60/60
minutes = (TimeEquation.seconds - hours*60*60)/60
seconds = TimeEquation.seconds - hours*60*60 - minutes * 60

print("今天是:",now.strftime("%Y-%m-%d %H:%M:%S"))
print("距離2019-02-01,還剩下%d天" % TimeEquation.days)
print(TimeEquation.days,hours ,minutes,seconds)


"""
今天是: 2018-09-08 11:42:38
距離2019-02-01,還剩下145天
145 20.289166666666667 0.0 0.0
"""
           

Python中的時區轉換

1、在Python中将一個時區的時間轉換成另一個時區的時間,比較常用的方法是:結合使用datetime子產品和pytz子產品,一般步驟為

    ⑴使用datetime子產品來擷取一個時間對象(datetime對象)

    ⑵使用pytz子產品來建立一個将要轉換到的時區對象

    ⑶使用datetime對象方法astimezone()方法來進行轉換

2、在介紹時區轉換前需要介紹兩個時間概念:

    ⑴navie時間:擷取的時間對象不知道自己的時間表示的是哪個時區的(如:使用datetime.now()方法擷取的時間對象就不知道目前表示的是哪個時區)

    ⑵aware時間:擷取的時間對象知道自己的時間表示的是哪個時區的

例19:

from datetime import datetime,timedelta,timezone
import pytz

now = datetime.now()
print(now)

utc_timezone = pytz.timezone("UTC")#使用pytz.timezone()方法來建立一個時區對象
utc_now = now.astimezone(utc_timezone)#使用astimezone()方法來将時間轉換為另一個時區的時間
print(utc_now)

"""
2020-03-31 12:53:43.762358
ValueError: astimezone() cannot be applied to a naive datetime
"""
           

注:

1、從上面例子的輸出可以看出,在進行時區轉換時(now.astimezone(utc_timezone)),報錯了,這是因為:

    ⑴在使用datetime.now()擷取的時間對象是一個navie時間,即不知道自己的時間表示的是哪個時區。既然不知道自己的時間目前在哪個時區,那肯定是不能将目前時間轉化為另一個時區的時間的

    ⑵要解決這個問題,是以需要将使用datetime.now()擷取的這個時間加上一個時區标志

    ⑶要給一個無時區标志的時間加上一個時區标志,那就可以用到datetime對象下的replace()方法了

2、pytz.timezone(‘時區名’):此方法能擷取一個tzinfo對象,該對象可在datetime生成時間中以參數的形式放入,即可生成對應時區的時間

3、astimezone():datetime對象方法,用于将一個時區的時間轉為另一個時區的時間。這個方法隻能别aware類型時間調用,不能被navie類型的時間調用

4、replace():datetime對象方法,可以将一個時間的某些屬性進行修改

5、是以正确的将一個時區的時間轉為另一個時區的時間,可以使用下面這種方法

例19_1:

from datetime import datetime,timedelta,timezone
import pytz

now = datetime.now()
print(now)

utc_timezone = pytz.timezone("UTC")

now = now.replace(tzinfo=pytz.timezone("Asia/Shanghai"))
print(now)

utc_now = now.astimezone(utc_timezone)
print(utc_now)

"""
2020-03-31 13:09:37.666740
2020-03-31 13:09:37.666740+08:06
2020-03-31 05:03:37.666740+00:00
"""
           

注:"+08:06"表示的是目前時區的時間相對于UTC時間相差了多少

月曆子產品

1、此子產品的函數都是月曆相關的,例如列印某月的字元月曆

2、星期一是預設的每周第一天,星期天是預設的最後一天。更改設定需調用calendar.setfirstweekday()函數

calendar()

1、文法:calendar.calendar(year,w=2,l=1,c=6)

2、作用:傳回一個多行字元串格式的year年年曆,3個月一行,間隔距離為c。 每日寬度間隔為w字元。每行長度為21* W+18+2* C。l是每星期行數

例20:

import calendar

print(calendar.calendar(1993))

"""
上面代碼的輸出結果為:
                                1993

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7       1  2  3  4  5  6  7
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       8  9 10 11 12 13 14
11 12 13 14 15 16 17      15 16 17 18 19 20 21      15 16 17 18 19 20 21
18 19 20 21 22 23 24      22 23 24 25 26 27 28      22 23 24 25 26 27 28
25 26 27 28 29 30 31                                29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
          1  2  3  4                      1  2          1  2  3  4  5  6
 5  6  7  8  9 10 11       3  4  5  6  7  8  9       7  8  9 10 11 12 13
12 13 14 15 16 17 18      10 11 12 13 14 15 16      14 15 16 17 18 19 20
19 20 21 22 23 24 25      17 18 19 20 21 22 23      21 22 23 24 25 26 27
26 27 28 29 30            24 25 26 27 28 29 30      28 29 30
                          31
下面的月份就不寫了
"""
           

month()

1、文法:calendar.month(year,month,w=2,l=1)

2、傳回一個多行字元串格式的year年month月月曆,兩行标題,一周一行。每日寬度間隔為w字元。每行的長度為7* w+6。l是每星期的行數

例21:

import calendar

print(calendar.month(1993,7))

"""
上面代碼的輸出結果為:
     July 1993
Mo Tu We Th Fr Sa Su
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
"""
           

isleap()

1、文法:calendar.isleap(year)

2、傳回值:是閏年傳回True,否則為false

例22: 

import calendar

month = calendar.isleap(1993)

if month == False:
    print("1993年不是閏年")

#上面代碼的輸出結果為:1993年不是閏年
           

leapdays()

1、文法:calendar.leapdays(y1,y2)

2、傳回值:傳回在Y1,Y2兩年之間的閏年總數

例23:

import calendar

print(calendar.leapdays(2008,2018))

#上面代碼的輸出結果為:3
           

注:calendar子產品中還有其他的一些函數,由于這個子產品用的不是很多,多以就不一一列舉了

拓展

UTC time

Coordinated Universal Time,世界協調時,又稱 格林尼治天文時間、世界标準時間。與UTC time對應的是各個時區的local time

    ⑴東N區的時間比UTC時間早N個小時,是以UTC time + N小時即為東N區的本地時間

    ⑵西N區時間比UTC時間晚N個小時,即 UTC time - N小時 即為西N區的本地時間

    ⑶中國在東8區,是以比UTC時間早8小時,可以以UTC+8進行表示

按天生成日志

例24:

import os
import datetime,time

def make_dir():
    get_file_path = os.path.realpath(__file__)
    get_file_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(get_file_path))))
    make_file_path = os.path.join(get_file_dir+"{}".format(str(datetime.datetime.now().year)
    + "_" + str(datetime.datetime.now().month) + "_" + str(datetime.datetime.now().day)))
    make_file_name = make_file_path + "_log.txt"
    print(make_file_name)
    return make_file_name


def open_file(log_file_path):
    log_file = open(log_file_path,"w")
    return log_file


if __name__ == "__main__":
    make_file_name = make_dir()
    open_file(make_file_name)


"""
F:\2019_6_26_log.txt
"""