使用Python的datetime库处理时间(RPA流程)


Posted in Python onNovember 24, 2019

RPA流程自动化过程中,遇到时间的相关操作时,可以调用datetime库的一些方法进行处理。

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

1、获取当前日期和时间

我们先看如何获取当前日期和时间:

>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now)
2019-11-23 11:12:32.715604
>>> print(type(now))
<class 'datetime.datetime'>

注意到 datetime 是模块,datetime 模块还包含一个 datetime 类,通过 from datetime import datetime 导入的才是 datetime 这个类。

如果仅导入 import datetime,则必须引用全名 datetime.datetime。

datetime.now() 返回当前日期和时间,其类型是 datetime。

2、获取指定日期和时间

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

>>> from datetime import datetime
>>> time = datetime(2008,8,8,8,8) # 用指定日期时间创建 datetime
>>> print(time)
2008-08-08 08:08:00

3、datetime 转换为 timestamp

在计算机中,时间实际上是用数字表示的。我们把 1970 年 1 月 1 日 00:00:00 UTC+00:00 时区的时刻称为 epoch time,记为 0(1970 年以前的时间 timestamp 为负数),当前时间就是相对于 epoch time 的秒数,称为 timestamp。

你可以认为:

timestamp = 0 = 1970-1-1 00:00:00 UTC+0:00

对应的北京时间是:

timestamp = 0 = 1970-1-1 08:00:00 UTC+8:00

可见 timestamp 的值与时区毫无关系,因为 timestamp 一旦确定,其 UTC 时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以 timestamp 表示的,因为全球各地的计算机在任意时刻的 timestamp 都是完全相同的(假定时间已校准)。

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

>>> from datetime import datetime
>>> time = datetime(2019,11,23,11,25)
>>> time.timestamp()
1574479500.0

注意 Python 的 timestamp 是一个浮点数。如果有小数位,小数位表示毫秒数。

4、timestamp 转换为 datetime

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

>>> from datetime import datetime
>>> time = 1574479500.0
>>> print(datetime.fromtimestamp(time))
2019-11-23 11:25:00

注意到 timestamp 是一个浮点数,它没有时区的概念,而 datetime 是有时区的。上述转换是在 timestamp 和本地时间做转换。

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

实际上就是 UTC+8:00 时区的时间:2019-11-23 11:25:00 UTC+8:00

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

2019-11-23 03:25:00 UTC+0:00

timestamp 也可以直接被转换到 UTC 标准时区的时间:

>>> from datetime import datetime
>>> time = 1574479500.0
>>> print(datetime.fromtimestamp(time))
2019-11-23 11:25:00
>>> print(datetime.utcfromtimestamp(time)) # UTC 时间
2019-11-23 03:25:00

5、str 转换为 datetime

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

>>> from datetime import datetime
>>> today = datetime.strptime('2019-11-23 11:34:49','%Y-%m-%d %H:%M:%S')
>>> print(today)
2019-11-23 11:34:49
>>>

字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式,注意转换后的 datetime 是没有时区信息的。

6、datetime 转换为 str

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

>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
Sat, Nov 23 14:45

7、datetime 加减

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

>>> from datetime import datetime,timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2019, 11, 23, 14, 49, 49, 739236)
>>> now + timedelta(hours = 5)
datetime.datetime(2019, 11, 23, 19, 49, 49, 739236)
>>> now - timedelta(days = 1)
datetime.datetime(2019, 11, 22, 14, 49, 49, 739236)
>>> now - timedelta(days = 3,hours = 3)
datetime.datetime(2019, 11, 20, 11, 49, 49, 739236)

可见,使用 timedelta 你可以很容易地算出前几天和后几天的时刻。

8、本地时间转换为 UTC 时间

本地时间是指系统设定时区的时间,例如北京时间是 UTC+8:00 时区的时间,而 UTC 时间指 UTC+0:00 时区的时间。

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

>>> from datetime import datetime,timedelta,timezone
>>> time_utc = timezone(timedelta(hours=8)) # 创建时区 UTC+8:00
>>> now = datetime.now()
>>> now
datetime.datetime(2019, 11, 23, 14, 55, 5, 901745)
>>> now_utc = now.replace(tzinfo=time_utc) # 强制设置为 UTC+8:00
>>> now_utc
datetime.datetime(2019, 11, 23, 14, 55, 5, 901745, tzinfo=datetime.timezone(datetime.timedelta(0, 28800)))

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

9、时区转换

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

>>> utc_time = datetime.utcnow().replace(tzinfo=timezone.utc) # 拿到 UTC 时间,并强制设置时区为 UTC+0:00
>>> print(utc_time)
2019-11-23 07:05:25.865221+00:00
>>>
>>> bj_time = utc_time.astimezone(timezone(timedelta(hours=9))) #astimezone() 将转换时区为东京时间
>>> print(bj_time)
2019-11-23 16:05:25.865221+09:00
>>>
>>> dj_time = utc_time.astimezone(timezone(timedelta(hours=9))) #转换时区为东京时间
>>> print(dj_time)
2019-11-23 16:05:25.865221+09:00
>>>
>>> dj_time2 = bj_time.astimezone(timezone(timedelta(hours=9))) #将北京时间转换时区为东京时间
>>> print(dj_time2)
2019-11-23 16:05:25.865221+09:00

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

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

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

小结

datetime表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。

如果要存储datetime,最佳方法是将其转换为 timestamp 再存储,因为 timestamp 的值与时区完全无关。

免费下载试用: https://support.i-search.com.cn/

以上所述是小编给大家介绍的使用Python的datetime库处理时间(RPA流程),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python二分法实现实例
Nov 21 Python
python选择排序算法实例总结
Jul 01 Python
python列出目录下指定文件与子目录的方法
Jul 03 Python
Python实现简单多线程任务队列
Feb 27 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
python如何生成各种随机分布图
Aug 27 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
超简单的Python HTTP服务
Jul 22 Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 Python
解析Tensorflow之MNIST的使用
Jun 30 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
Python 中判断列表是否为空的方法
Nov 24 #Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 #Python
python求质数列表的例子
Nov 24 #Python
解决Python中回文数和质数的问题
Nov 24 #Python
使用python实现回文数的四种方法小结
Nov 24 #Python
python代码打印100-999之间的回文数示例
Nov 24 #Python
Django 自定义分页器的实现代码
Nov 24 #Python
You might like
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP类的使用 实例代码讲解
2009/12/28 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
Jquery实现弹出层分享微博插件具备动画效果
2013/04/03 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
js面向对象的写法
2016/02/19 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
Python编程中的文件操作攻略
2015/10/16 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
keras 多任务多loss实例
2020/06/22 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
中国文明网签名寄语
2014/01/18 职场文书
《木笛》教学反思
2014/03/01 职场文书
初中学生期末评语
2014/04/24 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
企业战略合作意向书
2015/05/08 职场文书
珍爱生命主题班会
2015/08/13 职场文书
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android