1. 程式人生 > >時間模組和時間工具

時間模組和時間工具

一、time模組

三種格式
時間戳時間:浮點數 單位為秒
時間戳起始時間:
1970.1.1 0:0:0 英國倫敦時間
1970.1.1 8:0:0 我國(東8區)
結構化時間:元組(struct_time)
格式化時間:str資料型別的

 

1、常用方法

import time

time.sleep(secs)   推遲指定的時間執行,單位是秒

for i in range(3):
    time.sleep(1)
    print(i)

 

2、表示時間的三種方式

時間戳(timestamp)、元組(struct_time)、格式化(str_time)的時間字串

1. 時間戳(timestamp) :通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量。 我們執行“type(time.time())”,返回的是float型別。 print(time.time()) # 1536050072.5732844(1970年1月1日00:00:00到此刻執行time.time()的時間) 2. 結構化時間(struct_time) :struct_time元組共有9個元素共九個元素:(年,月,日,時,分,秒,一週中第幾天,一年中第幾天,夏令時) struct_time = time.localtime() # 我國的時間 print(struct_time)
# time.struct_time(tm_year=2018, tm_mon=9, tm_mday=4, tm_hour=16, tm_min=40, tm_sec=1, tm_wday=1, tm_yday=247, tm_isdst=0) struct_time = time.gmtime() # 倫敦的時間 print(struct_time) # time.struct_time(tm_year=2018, tm_mon=9, tm_mday=4, tm_hour=8, tm_min=40, tm_sec=1, tm_wday=1, tm_yday=247, tm_isdst=0)
3. 格式化時間(Format_string): fmt1 =time.strftime('%H:%M:%S') # 時分秒(全大寫) fmt2 =time.strftime('%Y-%m-%d') # 年月日(年可大寫可小寫,月日小寫) fmt3 =time.strftime('%y-%m-%d') # 年月日 fmt4 =time.strftime('%c') # 本地相應的日期表示和時間表示 print(fmt1) # 16:49:03 print(fmt2) # 2018-09-04 print(fmt3) # 18-09-04 print(fmt4) # Tue Sep 4 16:49:03 2018

 

3、幾種時間格式間的轉換

1. 轉換

Timestamp ---> struct_time: time.localtime(轉成我國的時間)、time.gmtime(轉成倫敦時間)
struct_time ---> Timestamp: time.mktime()

Format_string ---> struct_time: time.strptime()
struct_time ---> Format_string: time.strftime()

 

2. 例子

1. 把格式化時間2018年8月8日轉成時間戳時間
str_time = '2018-8-8'
struct_time = time.strptime(str_time,'%Y-%m-%d')
print(struct_time)  # time.struct_time(tm_year=2018, tm_mon=8, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=220, tm_isdst=-1)
timestamp = time.mktime(struct_time)
print(timestamp)   # 1533657600.0


2. 把時間戳時間轉成格式化時間
timestamp = 1500000000
struct_time = time.localtime(timestamp)
str_time = time.strftime('%Y-%m-%d',struct_time)
print(str_time)   # 2017-07-14


3. 寫函式,計算本月1號的時間戳時間
通過我拿到的這個時間,能迅速的知道我現在所在時間的年 月
def get_timestamp():
    str_time = time.strftime('%Y-%m-1')
    struct_time = time.strptime(str_time,'%Y-%m-%d')
    timestamp = time.mktime(struct_time)
    return timestamp
ret = get_timestamp()
print(ret)

 

%y 兩位數的年份表示(00-99%Y 四位數的年份表示(0000-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. python中時間日期格式化符號

 

二、datetime模組

1、dateime.date

import datetime

1. datetime.date型別(年月日)
注意:datetime.date型別就是time模組的結構化時間,只是它在內部把結構化時間的顯示格式化了再打印出來
datetime.date.today()
datetime.date(2018, 12, 21)


2.根據給定的時間戮,返回一個date物件
datetime.date.fromtimestamp(timestamp)  # 返回一個date物件,與datetime.date.today()作用相同
datetime.date.fromtimestamp(1528345678)  # 2018-06-07


3.由date日期格式轉化為字串格式
datetime.date.strftime(format)

datetime.date.today().strftime('%Y-%m-%d')  # "2018-12-21"
注意:date型別沒有strptime

 

2、datetime.dateime

注意:datetime是繼承了date的類
1. datetime.datetime型別(年月日時分秒微妙時區)
datetime.datetime.today() 
datetime.datetime.now()

datetime.datetime(2018,12, 21, 8, 12, 8, 603000)

返回當前日期時間的日期部分
datetime.datetime.today().date()  # 2018-12-21
返回當前日期時間的時間部分
datetime.datetime.now().time()  # 15:19:16.230449


2.根據給定的時間戮,返回一個datetime物件
datetime.datetime.fromtimestamp()  # 返回一個datetime物件,與datetime.datetime.today()作用相同
datetime.datetime.fromtimestamp(1528345678)  # 2018-06-07 12:27:58


3. 由日期格式轉化為字串格式
datetime.datetime.strftime(format)
datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # "2018-12-21 09:17:14"


3.由字串格式轉化為日期格式
datetime.datetime.strptime()
datetime.datetime.strptime('2018-12-21 11:01:27', '%Y-%m-%d %H:%M:%S')


4. 結構化時間:元組
注意:這就是結構化時間初始的樣子
datetime.datetime.now().timetuple()
# time.struct_time(tm_year=2018, tm_mon=12, tm_mday=21, tm_hour=9, tm_min=18, tm_sec=1, tm_wday=4, tm_yday=355, tm_isdst=-1)

 

3、datetime.timedelta

datetime.timedelta用於計算兩個日期之間的差值

datetime.timedelta(weeks=1)  # 返回一個時間差,引數weeks,days,hours,minutes,[1 weeks=7 days],沒有years,months

例1:
import datetime
day7 = datetime.timedelta(days=7)  # 7天的時間時間隔  一年用52周表示 weeks=52
today = datetime.datetime.now()
# 7天之後的時間是什麼
# today + 7
after_7 = today + day7
print(after_7, type(after_7))


例2:
a=datetime.datetime.now()  # datetime.datetime(2018, 12, 21, 13, 15, 20, 871000)
b=datetime.datetime.now()  # datetime.datetime(2018, 12, 21, 13, 15, 29, 603000)

print(b-a)  # datetime.timedelta(0, 0, 8, 732000)
print((b-a).seconds)  # 8
print((b-a).total_seconds())  # 8.732


或者
time1 = datetime.datetime(2018, 12, 20)
time2 = datetime.datetime(2017, 11, 12)

"""計算天數差值"""
print((time1-time2).days)

"""計算兩個日期之間相隔的秒數"""
print ((time1-time2).total_seconds())

 

4、datetime.time

time類有5個引數,datetime.time(hour,minute,second,microsecond,tzoninfo),返回08:29:30

1.datetime.time.replace()

2.datetime.time.strftime(format):按照format格式返回時間

3.datetime.time.tzname():返回時區名字

4.datetime.time.utcoffset():返回時區的時間偏移量

 

三、時間工具dateutil

直接看例子感受時間工具的絕對時間relativedelta吧

from dateutil import relativedelta
import datetime

now = datetime.datetime.today()
print(now)  # 2018-12-21 15:47:31.005604

# 下個月
next_month = now + relativedelta.relativedelta(months=1)
print(next_month)  # 2019-01-21 15:47:31.005604


# 注意months和month的區別:
# months=1 表示在現在的日期基礎上加一個月的時間
# months=-1表示在現在的日期基礎上減一個月
# month=1 表示把現在的日期的月份設定為1月
# years, months, days, weeks, hours, minutes, seconds等也是跟對應的year,month,day,week...一樣
set_month = now + relativedelta.relativedelta(month=1)
print(set_month)  # 2018-01-21 15:47:31.005604


# 注意與datetime.timedelta區別:
# datetime.timedelta沒有months和years引數
# 因此一個月用weeks=4表示,只能表示28天后,有偏差
next_month2 = now + datetime.timedelta(weeks=4)
print(next_month2)  # 2019-01-18 15:47:31.005604


# 下個月加一週
next_month_week = now + relativedelta.relativedelta(months=1, weeks=1)
print(next_month_week)  # 2019-01-28 15:47:31.005604


# 下個月加一週,上午10點
next_month_week_ten = now + relativedelta.relativedelta(months=1, weeks=1, hour=10)
print(next_month_week_ten)  # 2019-01-28 10:47:31.005604


# 一年後的前一個月
next_year_premonth = now + relativedelta.relativedelta(years=1, months=-1)
print(next_year_premonth)  # 2019-11-21 15:47:31.005604