Day17内建模块datetime

datetime

>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2018-04-06 20:24:30.764172
>>> print(type(now))
<class 'datetime.datetime'>

注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。 如果仅导入import datetime,则必须引用全名datetime.datetimedatetime.now()返回当前日期和时间,其类型是datetime

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

>>> dt = datetime(2018,4,30,4,21,43)
>>> print(dt)
2018-04-30 04:21:43

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

>>> dt.timestamp()
1525033303.0

要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

>>> t = 1600000000.0
>>> print(datetime.fromtimestamp(t))
2020-09-13 20:26:40

str转换为datetime

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

>>> cday = datetime.strptime('2018-4-6 21:00:59', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
2018-04-06 21:00:59

字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。

datetime转换为str

如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的,同样需要一个日期和时间的格式化字符串:

>>> now = datetime.now()
>>> print(now)
2018-04-06 20:58:42.534038
>>> print(now.strftime('%a,%b %d %H:%M'))
Fri,Apr 06 20:58

datetime加减

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

>>> from datetime import datetime, timedelta, timezone
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 4, 6, 21, 3, 54, 668377)
>>> now + timedelta(hours=10)
datetime.datetime(2018, 4, 7, 7, 3, 54, 668377)
>>> now - timedelta(days=1)
datetime.datetime(2018, 4, 5, 21, 3, 54, 668377)
>>> now + timedelta(days=2, hours=12)
datetime.datetime(2018, 4, 9, 9, 3, 54, 668377)

本地时间转换为UTC时间

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

>>> tz_utc_8 = timezone(timedelta(hours=8))    # 创建时区UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 4, 6, 21, 10, 24, 942726)
>>> dt = now.replace(tzinfo=tz_utc_8)    # 强制设置为UTC+8:00
>>> dt
datetime.datetime(2018, 4, 6, 21, 10, 24, 942726, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))

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

时区转换

# 拿到UTC时间,并强制设置时区为UTC+0:00:
>>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
>>> print(utc_dt)
2018-04-06 13:18:11.351108+00:00
# astimezone()将转换时区为北京时间:
>>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
>>> print(bj_dt)
2018-04-06 21:18:11.351108+08:00
# astimezone()将转换时区为东京时间:
>>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt)
2018-04-06 22:18:11.351108+09:00
# astimezone()将bj_dt转换时区为东京时间:
>>> tokyo_dt2 = bj_dt.astimezone(timezone(timedelta(hours=9)))
>>> print(tokyo_dt2)
2018-04-06 22:18:11.351108+09:00

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JMCui

Netty 系列六(编解码器).

    网络传输的单位是字节,如何将应用程序的数据转换为字节,以及将字节转换为应用程序的数据,就要说到到我们该篇介绍的编码器和解码器。

12510
来自专栏编程坑太多

java:工作中常用到的工具类

19730
来自专栏pangguoming

Java 线程内异常处理

Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在...

38450
来自专栏coolblog.xyz技术专栏

Spring IOC 容器源码分析 - 创建单例 bean 的过程

在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑。对于已实例化好的单例 bean,getBean(Str...

25970
来自专栏芋道源码1024

Spring Webflux —— 源码阅读之 handler 包

查找给定请求的handler,如果找不到特定的请求,则返回一个空的Mono。这个方法被getHandler(org.springframework.web.se...

42050
来自专栏程序员维他命

iOS 代码规范

花了一个月的时间结合几篇博客和书籍写了这套 iOS 代码规范(具体参考底部的参考文献部分)。这套代码规范除了有仅适用于 iOS 开发的部分,还有其他的比较通用性...

24720
来自专栏iOS开发

iOS开发之 Method Swizzling 深入浅出

如果产品经理突然说:"在所有页面添加统计功能,也就是用户进入这个页面就统计一次"。我们会想到下面的一些方法:

49370
来自专栏coding

萧峰与郭靖教你学会PHP的Trait

12030
来自专栏Linyb极客之路

工作流引擎之activiti利用juel进行条件分支判断

有接触过activiti的小伙伴们,可能会知道activiti可以利用网关来达到分支流转,但是对于一些业务员来说,跟他们说啥是网关,他们可能会一脸懵逼,尤其ac...

1.8K60
来自专栏逍遥剑客的游戏开发

MPQ文件系统优化(续)

18450

扫码关注云+社区

领取腾讯云代金券