python时区运算,时区,时间戳,夏令时讲解
目录
- 统一概念
- 标准时间
- 时区
- 时间戳
- 字符串表示
- Python中的时间处理 - Arrow
- 为什么使用Arrow?
- 功能
- 快速入门
- 安装
- 用法示例
- 实例代码
- 参考
- 其他语言处理方式参考:
- 外链
统一概念
首先先理解一些通用的概念。
标准时间
- 可以理解为世界时间,不存在时区问题
- utc:(Universal Time Coordinated),协调世界时。全世界统一的世界标准时间。需要不规则地加入闰秒。
- GMT:(Greenwich Mean Tim),格林尼治平均时间。
- 一般认为UTC和GMT是相等的,但是会存在0.9秒以内的误差,这是由于地球不规则自转引起的。
时区
- 人类的生存规则日出而作日落而息,对时间的定义亦是如此;但是全世界日出日落并不在同一时刻,所以就出现了时差问题; 为了方便计算时差问题而推出的世界时区规则 UTC +/-。
- 本地时间:,UTC+时区,东为正西为负。比如北京时间在东八区就是 UTC+(+0800)。
- DST:,夏令时。是指夏天太阳升起比较早,将时钟拨快一个小时来提早日光的使用。欧美主要国家都引用了这个做法。如果在夏令时时区内 DST=UTC+时区+1。
时间戳
- 由UTC世界标准时间转换而来,不带时区;同一时刻获取的时间戳在全世界都是相同的。
- Unix时间戳: 表示从UTC1970年1月1日0时0分0秒起至现在的总秒数,不考虑闰秒
- 时间戳: 表示从UTC1970年1月1日0时0分0秒起至现在的毫秒数。
字符串表示
为了让时间易于阅读又出现了用各种字符串来表示时间的方法。
RFC2822 官方白皮书:https://tools.ietf.org/html/rfc2822#page-14
YYYY/MM/DD HH:MM:SS ± timezone(时区用4位数字表示)
// 1992/02/12 12:23:22+0800
ISO 8601 维基百科:https://zh.wikipedia.org/wiki/ISO_8601
YYYY-MM-DDThh:mm:ss ± timezone(时区用HH:MM表示)1997-07-16T08:20:30Z
// “Z”表示UTC标准时区,即"00:00",所以这里表示零时区的`1997年7月16日08时20分30秒`
// 日期时间合并表示时,要在时间前面加一大写字母T// 如要表示东八区时间2004年5月3日下午5点30分8秒,可以写成
2004-05-03T17:30:08+08:00
20040503T173008+08
Python中的时间处理 - Arrow
为什么使用Arrow?
Python的标准库和其他一些底层模块具有几乎完整的日期,时间和时区功能,但是从可用性的角度来看效果并不理想:
- 太多模块:日期时间,时间,日历,dateutil,pytz等
- 类型太多:日期,时间,日期时间,tzinfo,timedelta,relativedelta等。
- 时区和时间戳转换冗长且令人不快
- 时区朴素是常态
- 功能上的差距:ISO 8601解析,时间跨度,人性化
功能
- 完全实现的日期时间的直接替换
- 支持Python 2.7、3.5、3.6、3.7和3.8
- 默认为时区感知和UTC
- 为许多常见的输入方案提供超简单的创建选项
- shift 支持相对偏移量(包括周)的方法-
- 自动格式化和解析字符串
- 广泛支持ISO 8601
- 时区转换
- 时间戳记可作为属性使用
- 生成时间范围,范围,下限和上限,以显示从微秒到年的时间范围
- 人性化并支持不断增加的贡献区域列表
- 可扩展为您自己的箭头衍生类型
- 只动识别夏令时
快速入门
安装
要安装Arrow,请使用pip或pipenv:
$ pip install -U arrow
用法示例
>>> import arrow # 获得标准时
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2018-11-13T13:34:28.469607+00:00]># 时区转换
>>> local = utc.to("Asia/Shanghai")
<Arrow [2018-11-13T21:36:41.001464+08:00]># 比较
>>> utc > utc.shift(hour=-1)
True# 字符串转换
>>> arrow.get('2013-05-11T21:23:58.970460+00:00')
<Arrow [2013-05-11T21:23:58.970460+00:00]># 格式化输出
>>> local.format('YYYY-MM-DD HH:mm:ss ZZ')
'2018-11-13 21:36:41 +08:00'# 可读性
>>> local.humanize()
'an hour ago'
>>> local.humanize(locale='zh')
'1小时前'# 时间戳
>>> utc.timestamp
1542116201
实例代码
import arrow
from datetime import datetime
import pytzdef test_demo():"""arrow 实例:return:"""# 获取当前utc时间(世界时间)utc = arrow.utcnow()print("当前世界时间:%s" % utc) # 2020-04-19T06:31:29.595262+00:00# 减去一小时utc_h = utc.shift(hours=-1)print("当前世界时间减去一小时:%s" % utc_h) # 2020-04-19T05:31:29.595262+00:00# 传入时区('Asia/Shanghai')北京时间,打印的时间是加8小时后的local = utc.to('Asia/Shanghai')print("北京当前时间:%s" % local) # 2020-04-19T14:31:29.595262+08:00# 转换成时间戳(单位秒),此处注意只有带时区的时间信息转换后的时间戳才是正确的;timestamp = local.timestampprint("UTC 时间戳:%s" % timestamp) # 1587278432# 显示格式转换form = local.format() # 默认格式:"YYYY-MM-DD HH:mm:ss ZZ"print("带时区信息的北京时间:%s" % form) # 2020-04-19 14:43:50+08:00form = local.format("YYYY-MM-DD HH:mm:ss")print("格式化后的北京时间:%s" % form) # 2020-04-19 14:43:50def test_arrow_now():"""arrow.now() 使用:return:"""# 获取当前utc时间(世界时间)utc = arrow.utcnow()print(utc) # 2020-04-19T06:31:29.595262+00:00# 获取当期时间(本地时间),不指定时区时默认本机时区,自动识别本机时区;utc = arrow.now()print(utc) # 2020-04-19T14:50:26.412411+08:00# 自定义时区 ‘America/St_Johns’加拿大时区utc = arrow.now(tz='America/St_Johns')print(utc) # 2020-04-19T04:26:01.613671-02:30def test_arrow_get():"""arrow.get() 使用:return:"""# 时间戳转换日期格式,默认转换为utc世界时间,反转请看demo02utc = arrow.get(1587280058) # 秒级print(utc) # 2020-04-19T06:56:01+00:00utc = arrow.get(1587280058.2278044) # 毫秒级print(utc) # 2020-04-19T07:07:38.227804+00:00# 支持传入datetime类型,arrow对datetime支持非常友好,此处不一一列举;utc = arrow.get(datetime.utcnow())print(utc) # 2020-04-19T07:07:38.227804+00:00# arrow 格式转datetimea = arrow.utcnow()var = a.datetimeprint(type(var)) # <class 'datetime.datetime'># 字符串格式日期,转arrow 日期格式arrow_time = arrow.get('2020-04-19 07:30:45', 'YYYY-MM-DD HH:mm:ss')print(arrow_time) # 2020-04-19T07:30:45+00:00arrow_time = arrow.get('2020-04-19T07:30:45.000-07:00')print(arrow_time) # 2020-04-19T07:30:45-07:00arrow_time = arrow.get(2020, 4, 19)print(arrow_time) # 2020-04-19T00:00:00+00:00def demo01():"""北京时间转加拿大纽芬兰时区时间计算公式:北京时间 = 世界时间 + 8小时加拿大纽芬兰时区时间 = 世界时间 - 3:30小时加拿大纽芬兰时区夏令时时间 = 北京时间 - 8小时 - 3:30小时 + 1小时:return:"""# 加拿大有很多时区,我们这里选择纽芬兰时区timezone = "America/St_Johns"# 北京时间timestr = "2020-04-19 16:19:48"# 此处重点注意:# 1,get()只能用来做格式转换,不能进行时区转换,转换需要使用to()方法# 2,北京时间不能直接进行转换,需要使用replace()指定传入时间的时区a_time = arrow.get(timestr, 'YYYY-MM-DD HH:mm:ss').replace(tzinfo='Asia/Shanghai')# arrow会自动识别时区是否进入夏令时,进入后会自动+1jnd_time = a_time.to(tz=timezone)print(jnd_time) # 2020-04-19T05:49:48-02:30 加拿大夏令时时间return jnd_timedef demo02():"""北京时间转时间戳时间戳的定义:表示当前时间到1970年1月1日00:00:00 UTC对应的毫秒数;重点:UTC (世界协调时)对应的秒数,不是北京时间对应的秒数;:return: UTC 时间戳(秒)"""# 北京时间timestr = "2020-04-19 16:19:48"# 此处重点注意:北京时间不能直接进行时间戳转换,需要使用replace()指定传入时间的时区,或者timestr中带上时区a_time = arrow.get(timestr, 'YYYY-MM-DD HH:mm:ss').replace(tzinfo='Asia/Shanghai')time = a_time.timestampprint(time) # 1587284388return timedef get_timezone():"""使用python内置库pytz 获取时区库(pytz:python内置时区库):return: 时区列表"""# 获取指定国家的时区iso3166_code国家代码对照表,加拿大Canada:catz = pytz.country_timezones(iso3166_code='CA')print(tz[0])# 获取全部时区# tz = pytz.all_timezonesreturn tzif __name__ == '__main__':test_demo()
参考
官方地址: https://arrow.readthedocs.io/en/latest/
其他语言处理方式参考:
JavaScript: https://segmentfault.com/a/1190000007581722
外链
时间网:http://www.shijian.cc/
时差:https://www.zeitverschiebung.net/cn/
未完待续…
python时区运算,时区,时间戳,夏令时讲解相关推荐
- python语言arrows用法_python时区运算,时区,时间戳,夏令时讲解
import arrow from datetime import datetime import pytz def test_demo(): """ arrow 实例 ...
- 时间那点儿事儿 -- 时间戳,时区,冬令时,夏令时
关于时间的那点儿事儿 -- 时间戳,时区,冬令时,夏令时 UTC.GMT.PST,冬令时.夏令时 看起来是不是很懵,看完本文后相信关于时间你会有一个清醒的认知. 时间按照不同的角度可以划分为: 时间戳 ...
- Python学习之datetime时间戳
众所周知,Python提供的用于处理日期和时间的标准模块名为datetime. 记录当前时间戳的常用方法为 >>> import datetime >>> date ...
- Python获取秒级时间戳与毫秒级时间戳
协调世界时 又称世界统一时间.世界标准时间.国际协调时间,简称UTC. 在计算机中,时间实际上是用数字表示的.我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch t ...
- 跟着王进老师学开发Python篇:基础入门案例讲解-王进-专题视频课程
跟着王进老师学开发Python篇:基础入门案例讲解-166人已学习 课程介绍 共计45个项目案例+项目源码,跟着王进老师尽情玩转Python解释器! 本课程涉及Python的基础语法, ...
- 视频教程-跟着王进老师学开发Python篇:基础入门案例讲解-Python
跟着王进老师学开发Python篇:基础入门案例讲解 教学风格独特,以学员视角出发设计课程,难易适度,重点突出,架构清晰,将实战经验融合到教学中.讲授技术同时传递方法.得到广大学员的高度认可. 王进 ¥ ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- Python的零基础超详细讲解(第五天)-Python的运算符
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
最新文章
- matlab中fliter函数,用C语言实现MATLAB中Filter()函数
- Mysql基于GTIDs的复制
- Yunyang tensorflow-yolov3 voc_train.txt以及voc_test.txt引用的路径位置
- react-native 单位换算(px,pt,dp,ppi)
- 将AX寄存器中的16位数据分成4组(从高到低),每组4位,然后把这4组数作为数当中的低4位分别放在AL,BL,CL,DL中。
- python中xy坐标如何从十个中找到最远的两个_python – Opencv单应性从像素xy坐标中查找全局xy坐标...
- 公众号管理模块-DouPHP模块化企业网站管理系统v1.6
- torch.cuda.is_aviaiable() 返回值为False的问题
- atom配置python环境_用Python制作网站Django实操与开发环境配置
- 智能云输入法 卸载残留问题
- Red Rover 简单字符串应用
- 坦克大战Netty网络联机版项目笔记
- slackware下ibus编译安装(更新:2010/10/17)
- 用Multisim13.0进行混频器的仿真
- shell 输出7的倍数
- macos系统镜像iso_系统原装ISO镜像软碟通刻录启动U盘教程
- Nginx反向代理实现负载均衡配置图解
- c语言难学吗?怎么学C语言?
- webpack打包压缩混淆_前端打包利器:webpack工具
- Qt 串口数据采集并绘图
热门文章
- Python编程好不好学?入门难吗?
- PDF文件太大了,如何免费压缩变小?
- canvas应用——圆角矩形图片
- 求最大公约数c语言实验心得,C语言编程实训报告(合集)
- Hadoop实例学习(八)全排序和区排序
- 斑马打印机打印不出来字怎么解决
- rimraf 命令快速删除 node_modules 包
- 更换固态硬盘并使用微pe安装windows7系统及万能网卡
- 2018铁三测评题write以及一些想送给你们的话
- 再次出发!FaceBook 开源“一站式服务“时序利器 Kats !