datetime模塊

Datetime模塊探索

寫在前面

本文介紹了Datetime,常用的內(nèi)容

  • naive datetime和 aware datetime 的概念
  • datetime.date datetime.time datetime.datetime
  • 時(shí)間之間的運(yùn)算方法datetime.timedelta
  • 使用pytz時(shí)區(qū)包,讓datetime成為aware datetime

naive datetime and aware datetime

在介紹之前我們線了解一下什么是naive datetimeaware datetime

根據(jù)詞面意思來理解就是 "考慮不周全的時(shí)間日期" 和 "考慮周全的時(shí)間日期",它只是兩種抽象的概念

  • naive datetime 沒有時(shí)區(qū)信息,它提供的信息不如aware datetime時(shí)間類型詳細(xì),但是它很方便使用,如果你不需要很難詳細(xì)的時(shí)間信息,可以使用naive datetime
  • aware datetime 如果需要使用時(shí)區(qū)信息,并且想避免一些信息的混亂最好使用aware datetime

naive datetime

先來看看 naive datetime,它是沒有時(shí)區(qū)信息的時(shí)間類型

datetime中分成三個(gè)大部分,其中,

  • datetime.date:date部分只含有年 月 日信息
  • datetime.time:time部分只含有時(shí) 分 秒 微秒
  • datetime.datetime:datetime部分包含datetime 兩部分的信息,也就是包含年 月 日 時(shí) 分 秒 微秒

datetime.date

datetime.date 對象只能創(chuàng)建 年 月 日 這樣的日期

創(chuàng)建自定義日期

注意:個(gè)位數(shù)的月和日前面不要加‘0’

import datetime

d = datetime.date(2016,7,24)
print(d)
2016-07-24

獲取本地時(shí)間

tday = datetime.date.today()
print(tday)
2018-09-07

分別獲取本地時(shí)間種的年,月,日,周

# 獲取年
print(tday.year)
# 獲取月
print(tday.month)
# 獲取日
print(tday.day)
# 獲取星期幾,0-6代表周一到周天
print(tday.weekday())
# 獲取星期幾,1-7代表周一到周天
print(tday.isoweekday())
2018
9
7
4
5

datetime.timedelta

datetime.timedelta方法可以對時(shí)間進(jìn)行運(yùn)算操作

獲得七天后的日期

import datetime
# 獲得本地日期
tday = datetime.date.today()
# 定義操作時(shí)間 day=7 也就是可以對另一個(gè)時(shí)間對象加7天或者減少7點(diǎn)
tdelta = datetime.timedelta(days=7)

# 打印今天的日期
print('今天的日期:{}'.format(tday))
# 打印七天后的日期
print('從今天向前推7天:{}'.format(tday + tdelta))
今天的日期:2018-09-07
從今天向前推7天:2018-09-14

日期相加減運(yùn)算規(guī)律

datetime.date對象 = datetime.date對象 ± datetime.timedelta對象

datetime.timedelta對象 = datetime.date對象 ± datetime.date對象

date2 = date1 + timedelta

timedelta = date2 - date1

定義datetime.date對象,定義datetime.timedelta對象,相加運(yùn)算得到datetime.date對象

# date1
date1 = datetime.date.today()
# timedelta
lta = datetime.timedelta(days=6)
# date2 = date1 + timedelta
date2 = date1 + lta

查看date1是否是datetime.date對象

type(date1)
datetime.date

查看lta是否是datetime.timedelta對象

type(lta)
datetime.timedelta

驗(yàn)證datetime.timedelta對象 = datetime.date對象 ± datetime.date對象

lta == date2 -date1
True

計(jì)算某日離今日有多少天

接著上面的計(jì)算法則我們就能很輕松的知道我們通過計(jì)算得到的結(jié)果是一個(gè)datetime.timedelta對象

讓我們來計(jì)算一下從今天到我的生日還有幾天,我今年的生日是2018-10-24

# 生日
bday = datetime.date(2018,10,24)
# 今天的日期
tday = datetime.date.today()
# 距離生日還有幾天
days = bday - tday
print('生日:{}'.format(bday))
print('今天的日期:{}'.format(tday))
print('距離生日還有{}天'.format(days))
生日:2018-10-24
今天的日期:2018-09-07
距離生日還有47 days, 0:00:00天

讓我們來驗(yàn)證一下是不是和上一條運(yùn)算法則能對上

print('{}-{}={}'.format(type(bday),type(tday),type(days)))
<class 'datetime.date'>-<class 'datetime.date'>=<class 'datetime.timedelta'>

果然是 datetime.date - datetime.date = datetime.timedelta

datetime.time

datetime.time只能生成 小時(shí) 分鐘 秒 微秒這樣的時(shí)間

t = datetime.time(9, 30, 45, 100000)
print(t)
09:30:45.100000

分別獲取datetime.time對象的 小時(shí) 分鐘 秒 微秒

print(t.hour)
print(t.minute)
print(t.second)
print(t.microsecond)
9
30
45
100000

datetime.datetime

由于

datetime.date對象只能生成年 月 日

datetime.time對象 只能生成 小時(shí) 分鐘 秒 微秒

如果我們想用 年 月 日 小時(shí) 分鐘 秒 微秒這樣的日期時(shí)間,這時(shí)候就需要datetime.datetime對象出場啦

import datetime
dt = datetime.datetime(2016, 7, 26, 12, 30, 45, 100000)
2016-07-26 12:30:45.100000

查看datetime.datetime對象創(chuàng)建的對象類型,是datetime.datetime類型

print(dt)
print(type(dt))
2016-07-26 12:30:45.100000
<class 'datetime.datetime'>

通過datetime.datetime類型的實(shí)例對象直接.date()就能獲得相應(yīng)的datetime.date對象

print(dt.date())
print(type(dt.date()))
2016-07-26
<class 'datetime.date'>

通過datetime.datetime類型的實(shí)例對象直接.time()就能獲得相應(yīng)的datetime.time對象

print(dt.time())
print(type(dt.time()))
12:30:45.100000
<class 'datetime.time'>

datetime.timedelta

datetime.datetime對象遵循著之前的運(yùn)算法則

即:
datetime.timedelta對象 = datetime.datetime對象 ± datetime.datetime對象

import datetime

dt = datetime.datetime(2018, 9, 7, 21, 28, 45, 100000)

tdelta = datetime.timedelta(days=12)

print(dt + tdelta)
2018-09-19 21:28:45.100000

datetime.datetime.(today()\now()\utcnow())

import datetime

dt_today = datetime.datetime.today()
dt_now = datetime.datetime.now()
dt_utcnow = datetime.datetime.utcnow()


print(dt_today)
print(dt_now)
print(dt_utcnow)
2018-09-08 10:51:31.000266
2018-09-08 10:51:31.000266
2018-09-08 02:51:31.000266

對比today()now()utcnow()之間的差異

從上面可以看出

  • datetime.datetime.today()返回本地datetime,不會(huì)返回時(shí)區(qū)
  • datetime.datetime.now()返回本地datetime,且可以返回時(shí)區(qū),如果你在括號種不傳入時(shí)區(qū),today()和now()就是一樣的
  • datetime.datetime.utcnow()返回UTC時(shí)間,北京時(shí)間就是UTC+8

aware datetime

pytz時(shí)區(qū)包

接著上面我們就來討論這個(gè)aware datetime,其實(shí)也就是加了時(shí)區(qū)的datetime

由于datetime并沒有提供產(chǎn)生時(shí)區(qū)的模塊,所以我們得使用第三方包pytz(python time zone)

如果沒有這個(gè)包的小伙伴可以自行安裝

pip install pytz

datetime.datetime()

import datetime
import pytz

dt = datetime.datetime(2018, 9, 15, 21, 47, 45, tzinfo=pytz.UTC)
print(dt)
2018-09-15 21:47:45+00:00

在datetime.datetime()種傳入 年 月 日 時(shí) 分 秒 時(shí)區(qū),得到結(jié)果2018-09-15 21:47:45+00:00最后加號后面的那幾位就是時(shí)區(qū)偏移量

datetime.datetime.now()

同樣datetime.datetime.now()也可以傳入時(shí)區(qū)

import datetime
import pytz

dt_now = datetime.datetime.now(tz=pytz.UTC)
print(dt_now)
2018-09-08 02:45:49.984126+00:00

datetime.datetime.utcnow()

同樣datetime.datetime.utcnow()也可以傳入時(shí)區(qū),不過麻煩很多,效果和上面的datetime.datetime.now()一樣,建議使用上面哪種

import datetime
import pytz

dt_utcnow = datetime.datetime.utcnow().replace(tzinfo=pytz.UTC)
print(dt_utcnow)
2018-09-08 02:45:51.467272+00:00

使用不同時(shí)區(qū)生成時(shí)間

查看pytz時(shí)區(qū)列表

import pytz
for tz in pytz.all_timezones:
    print(tz)
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Asmera
.......
US/Samoa
UTC
Universal
W-SU
WET
Zulu

生成'US/Mountain'時(shí)間

import datetime
import pytz

# 這是UTC時(shí)間
dt_now = datetime.datetime.now(tz=pytz.UTC)
# 這是`'US/Mountain'`時(shí)間
dt_min = dt_now.astimezone(pytz.timezone('US/Mountain'))
print(dt_now)
print(dt_min)
2018-09-07 13:58:25.595771+00:00
2018-09-07 07:58:25.595771-06:00

中國的時(shí)間只有上海時(shí)間

import datetime
import pytz

# 獲取UTC時(shí)間
dt_now = datetime.datetime.now(tz=pytz.UTC)
# 這是`'US/Mountain'`時(shí)間
dt_min = dt_now.astimezone(pytz.timezone('Asia/Shanghai'))
print(dt_now)
print(dt_min)
2018-09-08 02:58:05.581227+00:00
2018-09-08 10:58:05.581227+08:00

如果不需要時(shí)區(qū)

import datetime
dt_now = datetime.datetime.now()
print(dt_now)
2018-09-08 10:54:14.658342

如果需要時(shí)區(qū)

import datetime
import pytz
dt_now = datetime.datetime.now(tz=pytz.UTC)
dt_min = dt_now.astimezone(pytz.timezone('Asia/Shanghai'))

注意 naive time 不能使用.astimezone方法來改變時(shí)區(qū),只有 aware time可以

字符串和datetime之間的轉(zhuǎn)化

python中時(shí)間日期格式化符號:

  • %y 兩位數(shù)的年份表示(00-99)
  • %Y 四位數(shù)的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月內(nèi)中的一天(0-31)
  • %H 24小時(shí)制小時(shí)數(shù)(0-23)
  • %I 12小時(shí)制小時(shí)數(shù)(01-12)
  • %M 分鐘數(shù)(00=59)
  • %S 秒(00-59)
  • %a 本地簡化星期名稱
  • %A 本地完整星期名稱
  • %b 本地簡化的月份名稱
  • %B 本地完整的月份名稱
  • %c 本地相應(yīng)的日期表示和時(shí)間表示
  • %j 年內(nèi)的一天(001-366)
  • %p 本地A.M.或P.M.的等價(jià)符
  • %U 一年中的星期數(shù)(00-53)星期天為星期的開始
  • %w 星期(0-6),星期天為星期的開始
  • %W 一年中的星期數(shù)(00-53)星期一為星期的開始
  • %x 本地相應(yīng)的日期表示
  • %X 本地相應(yīng)的時(shí)間表示
  • %Z 當(dāng)前時(shí)區(qū)的名稱
  • %% %號本身

字符串轉(zhuǎn)datetime

strptime - String to Datetime

import datetime
import pytz

dt_str = 'July 26 2016'

dt = datetime.datetime.strptime(dt_str,'%B %d %Y')

print(dt)
2016-07-26 00:00:00

datetime轉(zhuǎn)字符串

strftime - Datettime to String

import datetime
import pytz

dt = datetime.datetime.now(tz=pytz.UTC)


dt_min = dt.astimezone(pytz.timezone('Asia/Shanghai'))

dt_min.strftime('%B %d %Y %Z')
'September 10 2018 CST'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容