使用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学习教程之常用的内置函数大全
Jul 14 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
python奇偶行分开存储实现代码
Mar 19 Python
flask框架视图函数用法示例
Jul 19 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
python线程的几种创建方式详解
Aug 29 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
搭建pypi私有仓库实现过程详解
Nov 25 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/10/03 PHP
PHP四大安全策略
2014/03/12 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
前端框架Vue.js构建大型应用浅析
2016/09/12 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
JS实现的倒计时恢复按钮点击功能【可用于协议阅读倒计时】
2018/04/19 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
岗位职责的定义
2013/11/10 职场文书
大学生求职工作的自我评价
2014/02/13 职场文书
主管会计岗位职责
2014/03/13 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
只用Python就可以制作的简单词云
2021/06/07 Python
Python中异常处理用法
2021/11/27 Python
Vue3如何理解ref toRef和toRefs的区别
2022/02/18 Vue.js