Python的收集整理:datetime模块

datetime模块

将最近收集到的datetime模块的用法进行了一些梳理,其中一些内容参考了廖雪峰指尖跳动的精灵的博客,时不时会更新。

datetime模块常用的有datetime(日期时间),date(日期),time(时间),timedelta(时间范围),timezone(时区)这几个类。

datetime类

datetime模块中含有datetime类,导入时注意。

创建

from datetime import datetime

dt = datetime(2016,12,25,18,28,32) #创建2016年12月25日18点28分32秒的datetime

datetime转为timestamp

ts = dt.timestamp()

timestamp转为datetime

dt = datetime.fromtimestamp(ts[, tz])  #本地时间,参数tz指定时区信息
dt_utc = datetime.utcfromtimestamp(ts)  #UTC时间

datetime转为str

strdt = dt.strftime('%a %b,%Y-%m-%d %H:%M:%S')

str转为datetime

dt = datetime.strptime('2016-12-25 18:28:32', '%Y-%m-%d %H:%M:%S')

其中括号里的字符串代表想要转成的格式

格式表:(注意大小写)

符号 含义 样式
%Y 2016
%m 12
%d 日(在月中) 25
%a 周(英文简写) Mon
%A 周(英文全写) Monday
%b 月(英文简写) Dec
%B 月(英文全写) December
%H 时(24) 18
%p AM或者PM PM
%I 时(12) 6
%M 28
%S 32
%f 微秒 4321

其他:
%c: 日期时间的字符串表示。(如: 04/07/10 10:43:39)
%j: 日在年中的天数 [001,366](是当年的第几天)
%U: 周在当年的周数当年的第几周),星期天作为周的第一天
%w: 今天在这周的天数,范围为[0, 6],6表示星期天
%W: 周在当年的周数(是当年的第几周),星期一作为周的第一天
%x: 日期字符串(如:04/07/10)
%X: 时间字符串(如:10:43:39)
%y: 2个数字表示的年份
%z: 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z: 时区名称(如果是本地时间,返回空字符串)

datetime加减

注意:加减需要导入timedelta这个类

from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
>>> now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
>>> now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)

时区问题

datetime有时区,默认为当前系统时区。timestamp没有时区概念

本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

2015-04-19 12:20:00  

实际上就是UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00  

而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2015-04-19 04:20:00 UTC+0:00

一个datetime类型有一个时区属性tzinfo,但是默认为None,无法区分这个datetime到底是哪个时区,除非强行给datetime设置一个时区。

>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8)) # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012)
>>> dt = now.replace(tzinfo=tz_utc_8) # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2015, 5, 18, 17, 2, 10, 871012, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))

时区转换

我们可以先通过utcnow()拿到当前的UTC时间,再转换为任意时区的时间:

# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2015-05-18 09:05:12.377316+00:00

# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2015-05-18 17:05:12.377316+08:00

# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2015-05-18 18:05:12.377316+09:00

# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2015-05-18 18:05:12.377316+09:00

时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。

利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的datetime都可以正确转换,例如上述bj_dt到tokyo_dt的转换。

其他属性方法

dt.year dt.month dt.day dt.hour .... #返回年,月,日,时等,类型为整数

datetime.today()  #返回一个表示当前本地时间的datetime对象

datetime.now([tz])  #返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间

datetime.utcnow()  #返回一个当前utc时间的datetime对象

datetime.combine(date, time)  #根据date和time,创建一个datetime对象

datetime.date()  #获取date对象

datetime.time()  #获取time对象

datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])   #替换,返回新datetime对象,原datetime不变

datetime.weekday()  #返回datetime的星期,周一返回0,周二返回1,。。。

datetime.isoweekday()  #返回datetime的星期,周一返回1,周二返回2,。。。

datetime.isocalendar()  #返回(年,周数,星期)的元组

datetime.isoformat()  #返回'YYYY-MM-DDTHH:MM:SS.mmmmmm'的字符串

date类

创建

import datetime
#创建2016年12月26日的date类型
d = datetime.date(2016,12,26)
#年的范围1~9999
#月的范围1~12  注意不要写0
#日的范围根据月定  注意不要写0

timestamp转为date

#参数位时间戳,返回一个date 类
d = datetime.date.fromtimestamp(timestamp)

date转为str

s = d.strftime(%Y-%m-%d)
#字符串格式如datetime类中所述

date加减,比较

注意:加减需要导入timedelta这个类

date1 > date2
date1 = date2 + timedelta
timedelat = date1 - date2

其他属性方法

datetime.date.today() #返回当前日期

d.year d.month d.day #返回date的年,月,日,类型为整数

d.replace(day=25)  #用新的年,月,日替换,返回替换后的新date,不改变原date

d.weekday()  #返回date的星期,周一返回0,周二返回1,。。。

d.isoweekday()  #返回date的星期,周一返回1,周二返回2,。。。

d.ioscalendar()  #返回(年,周数,星期)的元组

d.isoformat()  #返回'YYYY-MM-DD'的字符串

time类

注意:time类也有时区的概念

创建

import datetime
#创建15点32分25秒4321微秒的time类型
t = datetime.time(15,32,25,4321)
#hour的范围为[0, 24)
#minute的范围为[0, 60)
#second的范围为[0, 60)
#microsecond的范围为[0, 1000000)
#还可加一个tzinfo的时区参数

time转化str

s = t.strftime(%H:%M:%S)
#字符串格式如datetime类中所述

其他属性方法

t.hour t.minute t.second t.microsecond   #返回time的时、分、秒、微秒,类型为整数

t.tzinfo  #返回时区信息

t.replace(hour=16)   #用新的时、分、秒、微秒替换,返回替换后的新time,不改变原time

t.isoformat()  #返回'HH:MM:SS.mmmmmm'的字符串

timedelta类

创建

import datetime
td = datetime.timedelta(days=60)
#可用参数
timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

使用

now = datetime.datetime.now()
#2017-06-19 10:13:03,901942
td = datetime.timedelta(days=60)
tl = now-td
#2017-04-20 10:13:03,901942
tf = now+td
#2017-08-18 10:13:03,901942
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容