datetime模块

Datetime模块探索

写在前面

本文介绍了Datetime,常用的内容

  • naive datetime和 aware datetime 的概念
  • datetime.date datetime.time datetime.datetime
  • 时间之间的运算方法datetime.timedelta
  • 使用pytz时区包,让datetime成为aware datetime

naive datetime and aware datetime

在介绍之前我们线了解一下什么是naive datetimeaware datetime

根据词面意思来理解就是 "考虑不周全的时间日期" 和 "考虑周全的时间日期",它只是两种抽象的概念

  • naive datetime 没有时区信息,它提供的信息不如aware datetime时间类型详细,但是它很方便使用,如果你不需要很难详细的时间信息,可以使用naive datetime
  • aware datetime 如果需要使用时区信息,并且想避免一些信息的混乱最好使用aware datetime

naive datetime

先来看看 naive datetime,它是没有时区信息的时间类型

datetime中分成三个大部分,其中,

  • datetime.date:date部分只含有年 月 日信息
  • datetime.time:time部分只含有时 分 秒 微秒
  • datetime.datetime:datetime部分包含datetime 两部分的信息,也就是包含年 月 日 时 分 秒 微秒

datetime.date

datetime.date 对象只能创建 年 月 日 这样的日期

创建自定义日期

注意:个位数的月和日前面不要加‘0’

import datetime

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

获取本地时间

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

分别获取本地时间种的年,月,日,周

# 获取年
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方法可以对时间进行运算操作

获得七天后的日期

import datetime
# 获得本地日期
tday = datetime.date.today()
# 定义操作时间 day=7 也就是可以对另一个时间对象加7天或者减少7点
tdelta = datetime.timedelta(days=7)

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

日期相加减运算规律

datetime.date对象 = datetime.date对象 ± datetime.timedelta对象

datetime.timedelta对象 = datetime.date对象 ± datetime.date对象

date2 = date1 + timedelta

timedelta = date2 - date1

定义datetime.date对象,定义datetime.timedelta对象,相加运算得到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

验证datetime.timedelta对象 = datetime.date对象 ± datetime.date对象

lta == date2 -date1
True

计算某日离今日有多少天

接着上面的计算法则我们就能很轻松的知道我们通过计算得到的结果是一个datetime.timedelta对象

让我们来计算一下从今天到我的生日还有几天,我今年的生日是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天

让我们来验证一下是不是和上一条运算法则能对上

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只能生成 小时 分钟 秒 微秒这样的时间

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

分别获取datetime.time对象的 小时 分钟 秒 微秒

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

datetime.datetime

由于

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

datetime.time对象 只能生成 小时 分钟 秒 微秒

如果我们想用 年 月 日 小时 分钟 秒 微秒这样的日期时间,这时候就需要datetime.datetime对象出场啦

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

查看datetime.datetime对象创建的对象类型,是datetime.datetime类型

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

通过datetime.datetime类型的实例对象直接.date()就能获得相应的datetime.date对象

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

通过datetime.datetime类型的实例对象直接.time()就能获得相应的datetime.time对象

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

datetime.timedelta

datetime.datetime对象遵循着之前的运算法则

即:
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,不会返回时区
  • datetime.datetime.now()返回本地datetime,且可以返回时区,如果你在括号种不传入时区,today()和now()就是一样的
  • datetime.datetime.utcnow()返回UTC时间,北京时间就是UTC+8

aware datetime

pytz时区包

接着上面我们就来讨论这个aware datetime,其实也就是加了时区的datetime

由于datetime并没有提供产生时区的模块,所以我们得使用第三方包pytz(python time zone)

如果没有这个包的小伙伴可以自行安装

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()种传入 年 月 日 时 分 秒 时区,得到结果2018-09-15 21:47:45+00:00最后加号后面的那几位就是时区偏移量

datetime.datetime.now()

同样datetime.datetime.now()也可以传入时区

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()也可以传入时区,不过麻烦很多,效果和上面的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

使用不同时区生成时间

查看pytz时区列表

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'时间

import datetime
import pytz

# 这是UTC时间
dt_now = datetime.datetime.now(tz=pytz.UTC)
# 这是`'US/Mountain'`时间
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

中国的时间只有上海时间

import datetime
import pytz

# 获取UTC时间
dt_now = datetime.datetime.now(tz=pytz.UTC)
# 这是`'US/Mountain'`时间
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

如果不需要时区

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

如果需要时区

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

注意 naive time 不能使用.astimezone方法来改变时区,只有 aware time可以

字符串和datetime之间的转化

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 当前时区的名称
  • %% %号本身

字符串转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转字符串

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'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容