Python常用的内建模块1:datetime

datetime:Python处理日期和时间的标准库

  • 获取当前日期和时间:
>>> from datetime import datetime
>>> now = datetime.now() # 获取当前datetime
>>> print(now)
2018-07-17 14:45:23.464380

datetime是模块, datetime模块中还包含了datetime类, 通过from datetime import datetime导入的才是datetime这个类
如果仅导入improt datetime, 则需要引用全名datetime.datetime.或者导入import datetime as dt, 使用dt.datetime使用

  • 获取指定日期和时间

要指定某个日期和时间, 我们直接用参数构造一个datetime

>>> from datetime import datetime
>>> dt = datetime(2018, 7, 17, 14, 45) # 用指定日期时间创建datetime
>>> print(dt)
2018-07-17 14:45:00
  • datetime转换成timestamp

把一个datetime类型转换成timestamp类型只需要简单的调用timestamp()方法即可:

>>> from datetime import datetime
>>> dt = datetime(2018, 7, 17, 14, 45) # 用指定日期时间创建datetime
>>> dt.timestamp() # 把datetime转换为timestamp
1531809900.0
  • timestamp转换为datetime

要把timestamp转换成datetime简单的调用datetime提供的fromtimestamp即可:

>>> from datetime import datetime
>>> t = 1531809900.0
>>> print(datetime.fromtimestamp(t))
2018-07-17 14:45:00

注意到timestamp是一个浮点数, 它没有时区的概念, 而datetime是有时区的概念.上述的转换是在timestamp和本地时间做转换.
本地时间是指当前操作系统设定的时区. 例如北京时间是东八区, 则本地时间就是

2018-07-17 14:45:00

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

2018-07-17 14:45:00 UTC+8:00

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

2018-07-17 06:45:00 UTC+0:00

当然了timestamp也可以直接转成UTC标准时区的时间:

>>> from datetime import datetime
>>> t = 1531809900.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2018-07-17 14:45:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2018-07-17 06:45:00
  • str转换为datetime

很多时候用户输入的日期和时间是字符, 要处理日期和时间, 首先必须要把str转换成datetime.转换方式是通过datetimedatetime.strptime()实现, 需要一个日期和时间的格式化字符串:

>>> from datetime import datetime
>>> time = datetime.strptime('2018-7-17 14:45:00','%Y-%m-%d %H:%M:%S')
>>> print(time)
2018-07-17 14:45:00

字符串%Y-%m-%d %H:%M:%S规定了日期和时间部分的格式. 详情参考Python官方文档

  • datetime转换为str

如果要把datetime对象, 要把它格式化为字符串给用户看, 需要datetimestrftime()来实现:

>>> from datetime import datetime
>>> now = datetime.now()
>>> timeStr = now.strftime('%Y-%m-%d %H:%M:%S')
>>> print(timeStr)
2018-07-17 15:17:20
  • datetime加减

对日期和时间的加减实际上就是把datetime往后或者往前计算, 得到新的datetime.加减可以直接用+-运算符, 不过需要导入timedelta这个类:

from datetime import timedelta, datetime
>>> now = datetime.now()
>>> print(now)
2018-07-17 15:30:36.501466
>>> now + timedelta(hours=1)
datetime.datetime(2018, 7, 17, 16, 30, 36, 501466)
>>> now - timedelta(hours=20)
datetime.datetime(2018, 7, 16, 19, 30, 36, 501466)
>>> now - timedelta(days=1, hours=10)
datetime.datetime(2018, 7, 16, 5, 30, 36, 501466)
  • 本地时间转换为UTC时间

本地时间是指系统设定时区的时间, 例如北京时间是UTC+8:00时区, 而UTC时间指UTC+0:00时区的时间
一个datetime类型有一个时区属性tzinfo,但是默认为None,所以无法区分这个datetime到底是哪个时区, 除非强行给datetime设置一个时区

>>> from datetime import datetime, timedelta, timezone
>>> tz_utc_8 = timezone(timedelta(hours=8))
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 7, 17, 16, 26, 4, 208044)
>>> dt = now.replace(tzinfo=tz_utc_8)
>>> dt
datetime.datetime(2018, 7, 17, 16, 26, 4, 208044, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800)))

如果系统时区恰好是UTC+8:00, 那么上述代码是正确的, 否则不能强制设置

  • 时区转换

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

>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt) #获取UTC时间
2018-07-17 08:30:24.605313+00:00
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)  #获取北京时间
2018-07-17 16:30:24.605313+08:00
>>> dj_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(dj_dt)  #获取东京时间
2018-07-17 17:30:24.605313+09:00
>>> dj_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(dj_dt2) #从北京时间获取东京时间
2018-07-17 17:30:24.605313+09:00

时区的转换在于拿到一个datetime时间, 要获知正确的时区, 然后强制设置时区, 作为基准时间.
利用带时区的datetime, 通过astimezone()方法可以转换到任意时区.

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

推荐阅读更多精彩内容