1. 程式人生 > >Python基礎知識之Datetime

Python基礎知識之Datetime

本篇文章將介紹一下Datetime相關的使用

data

我們首先來看date的使用

import datetime

d = datetime.date(2018,8,2)
print(d) # 2018-08-02

在這裡需要注意的是如果date裡面寫成(2018,08,02)是會報錯的

如何獲取當前時間

import datetime

tday = datetime.date.today()
print(tday) # 2018-12-16
print(tday.year) # 2018
# 當然這裡我們去列印它的年月日都可以,在這裡就不一一展示了
print(tday.weekday()) # 這裡獲取的是6,其實應該是7
# 那麼很多小夥伴會在這裡進行+1操作,其實不必,這裡為我們提供了一個isoweekday()方法
print(tday.isoweekday()) #7

如何獲取一週以後的時間

import datetime

tday = datetime.date.today() # 2018-12-16
week_later_day = datetime.timedelta(days=7)
print(tday+week_later_day) # 2018-12-23

如何獲取距離某個特殊日子的時間

import datetime

tday = datetime.date.today()
# 假如我的生日是12月30日
birthday = datetime.date(2018,12,30)
print(birthday-tday) # 14 days, 0:00:00
# 那如果是多少秒呢?很多小夥伴估計會*24*60*3600,實際上我們沒有必要這麼做,它為我們提供了一個total_seconds()方法
print((birthday-tday).total_seconds()) # 1209600.0

time

time的使用

import datetime

tday = datetime.time(12,30,41)
print(tday) # 12:30:41
# 當然這裡我們也可以輸出小時、分鐘、秒,如果我們輸出年月日就會報錯,time模組不支援該方法
print(tday.hour) #12

time和data的區別

從上面的例子中不難看出,data針對的是年月日的操作,而time針對的是時分秒的操作

而我們平時工作中用的比較多的是datetime模組,它是將兩個模組的屬性進行了統一,這個時候我們就可以呼叫它的年月日時分秒中每一個屬性,不會報錯

import datetime

tday = datetime.datetime(2018,12,16,12,30,45)
print(tday) # 2018-12-16 12:30:45

strftime()與strptime()

strftime()是將日期格式轉化成字串

import datetime

tday = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(tday) # 2018-12-16 12:45:10

tday = datetime.datetime.now().strftime("%b-%d-%y %H:%M:%S")
print(tday) # Dec-16-18 12:46:52
import datetime

tday = datetime.datetime.strptime('Dec-16-18 12:46:52','%b-%d-%y %H:%M:%S')
print(tday) # 2018-12-16 12:46:52

以上就是datetime的基本使用,接下來介紹幾個在實際工作中遇到的問題該怎麼去解決

從當前的時間減去一天

import datetime

tday = datetime.date.today() # 2018-12-16
tdelta = datetime.timedelta(days=1) #當然這裡的days也可以為-1,相應的就變為tday+tdelta
print(tday-tdelta) # 2018-12-15

計算最近2個月的時間

import datetime
from dateutil.relativedelta import relativedelta
print(datetime.date.today() + datetime.timedelta(2*365/12)) # 2019-02-14
print(datetime.date.today() + relativedelta(months=2)) # 2019-02-16

這裡我為了讓大家看到上面那種計算是有誤差的,我就選了2個月來進行區分,因為上面那種方法沒有考慮哪一月有多少天

我們在做爬蟲的時候經常會遇到類似時間格式的字串“20181216123045”,這種如何將它變為常見的日期格式呢?

import datetime

from dateutil.parser import parse
t = '20181216123045'

print(parse(t).strftime('%Y-%m-%d %H:%M:%S')) # 2018-12-16 12:30:45

當我們得到這樣的結果是非常高興地,至少我在第一次用到這種方法的時候蠻開心的

有時候工作中會將在一個固定時間增加30s,我們該怎麼做?

import datetime

a = datetime.datetime(2018,12,16,13,15,15)
b = a + datetime.timedelta(seconds=30)
print(b) # 2018-12-16 13:15:45
b = a + datetime.timedelta(seconds=50)
print(b) # 2018-12-16 13:16:05

如何找出每個月的最後一天?

大家可能首先會新建一個dict然後在裡面寫上每個月對應的天數,然後判斷當前是第幾月,然後再使用dict裡面的值,這種方法就顯得比較繁複,今天給大家帶來一個比較好的方法

import datetime
def last_day_month(any_day):
    next_month = any_day.replace(day = 28) + datetime.timedelta(days=4)# 這裡要考慮2月有28天,隨便加幾天但是要保證能夠湊到31天,這裡可以是4,5,6.....
    print(next_month) # 第一次2018-03-04 第二次2019-01-01
    print(next_month.day) # 第一次4 第二次1
    return next_month-datetime.timedelta(days=next_month.day)# 這裡比較關鍵的一點就是要把多餘的天數給減掉
print(last_day_month(datetime.date(2018,2,17))) # 2018-02-28
print(last_day_month(datetime.date(2018,12,16))) # 2018-12-31