使用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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 Python
python将图片转base64,实现前端显示
Jan 09 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
Django自关联实现多级联动查询实例
May 19 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
python相对企业语言优势在哪
Jun 12 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP反射机制原理与用法详解
2017/02/15 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
Vue中computed及watch区别实例解析
2020/08/01 Javascript
pandas 选择某几列的方法
2018/07/03 Python
python一键去抖音视频水印工具
2018/09/14 Python
Django的models模型的具体使用
2019/07/15 Python
python中取绝对值简单方法总结
2020/07/24 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
如何把python项目部署到linux服务器
2020/08/26 Python
东方通信股份有限公司VC面试题
2014/08/27 面试题
幼儿园消防安全制度
2014/01/26 职场文书
科学发展观标语
2014/10/08 职场文书
公司授权委托书
2014/10/17 职场文书
专职安全员岗位职责
2015/04/11 职场文书
道歉情书大全
2015/05/12 职场文书
刑事案件上诉状
2015/05/23 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android