utc时间、本地时间及时间戳转化
1、时间戳的概念
时间戳的定义请看百科unix时间戳,需要注意的时间戳为当前时刻减去UTC时间(1970.1.1)零点时刻的秒数差,与当前系统所处的时区无关,同一时刻不管在任何时区下得到的时间戳都是一样的。
最近因为存储数据库需要将时间转为时间戳的字节型来存储,用了python datetime模块,期间遇到一些问题,现在终于弄懂了时间戳、时间和UTC时间的正确转换关系,总结以下供大家参考。
2、python datatime模块实现时间戳和本地时间、UTC时间之间的互相转化
1) 获得unix timestamp
dt=datetime.datetime.now() #获取本地当前时间
dt.timestamp() #获取时间戳
注:
- 此方式下now()函数中有个参数为tz,参数意思为时区信息,不设时为本地时间,当设置时,如tz=timezone.utc,则表示为当前的utc时间,无论是utc时间还是本地时间,获得的时间戳都是同一个值.
- timestamp()内部会根据时区设置得到时间戳,当时区为utc时间时timestamp()函数直接减去EPOCH得到的秒数,当为其他时区的时间时通过标准C库函数mktime得到相差秒数,不管哪种方式,相差的秒数差是一样的,所以不同时区下的时间戳必定为同一个值。
2) python datetime模块的小坑
由1)的阐述得到python在不同时区下都能获得时间戳,我就采用了utc时间获得时间戳,datetime有两种方式获得utc时间:
方式一:
dt=datetime.datetime.now(timezone.utc) #类型为aware datetime object,时区为utc
dt.timestamp() #通过减去EPOCH得到时间戳
方式二:
dt=datetime.datetime.utcnow() #类型为naive datetime object,不包含时区信息
dt.timestamp() #通过mktime得到时间戳(得到的时间戳是错误的
- 在未理解naive和aware之前,以为两种方式获得时间戳都是一样的,未曾想第二种方式下再通过timestamp()获得的时间戳是错误的,为什么会发生这种情况,是因为naive是不含时区的类型,而aware是有时区类型。
- 第二种虽然和方式一获得的值是相同的,但是第二种方式不包含时区信息,在方式二下执行dt.timestamp(),timestamp()默认tz=None,即为本地时区,这样就会按照mktime得到秒数差,但其实此时dt却是utc时间。而方式一有时区信息,执行dt.timestamp()是直接减去EPOCH时间。
- 当时间值相同时,naive类型和aware类型时间下执行timestamp()结果是不一样的,一定要注意,不能踩了这个坑,除非是本地时间,如果想通过其他时区的时间通过timestamp()得到时间戳,一定要带有时区信息。
3) 通过timestamp得出datetime和utc datetime
timestamp转datetime
datetime.datetime.fromtimestamp(timestamp) #获得本地时间,类型naive datetime obiect
timestamp转utc datetime
两种方式获得utc时间,但datetime object类型不一样。
方式一:
datetime.datetime.utcfromtimestamp(timestamp) #类型naive datetime object
方式二:
datetime.datetime.fromtimestamp(timestamp,timezone.utc) #类型aware datetime object。
3、总结:
- timestamp没有时区之分,不要认为不同时区有不同的时间戳。
- datetime object有两种类型,naive是不含时区的类型,而aware是有时区类型,就算显示的值一样,不同类型的object也不能直接进行数学运算。
utc时间、本地时间及时间戳转化的更多相关文章
- UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明
1.UTC时间 与 GMT时间 整个地球分为二十四时区,每个时区都有自己的本地时间.为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated). ...
- UTC 转本地时间
String dateStr = "Wed Dec 10 00:00:00 UTC 0800 2014"; //Wed Dec 10 00:00:00 UTC 0800 2014 ...
- UTC与本地时间字符串互相转换
#!/usr/bin/env python import time import datetime # 格式自改 UTC_FORMAT = '%Y-%m-%dT%H:%M:%SZ' LOCAL_FOR ...
- Sql Server 的本地时间和UTC时间
一,本地时间和UTC时间 本地时间 世界的每个地区都有自己的本地时间,整个地球分为二十四时区,每个时区都有自己的本地时间. UTC时间 在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时 ...
- UTC、GTC时间和本地时间
1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...
- 关于UTC时间和本地时间
收藏了个类Publics 可以实现本地时间和UTC时间的转换 UCT时间=本地时间-8 本地时间比UTC时间快8小时 element-ui的日期选择器上 选择的时间显示的是本地时间 但实 ...
- QDateTime 本地时间和UTC时间转换问题
先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...
- UTC、GTC时间和本地时间(Linux默认使用UTC时间,要修改一下)
1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...
- scala 时间,时间格式转换
scala 时间,时间格式转换 1.scala 时间格式转换(String.Long.Date) 1.1时间字符类型转Date类型 1.2Long类型转字符类型 1.3时间字符类型转Long类型 2. ...
随机推荐
- Yaml 的python 应用
1.安装yaml的python包 2.准备yaml的数据 3.yaml.load 解析yaml 3.生产yaml
- git入门五(分支合并冲突和衍合)
分支合并冲突的处理 合并分支的冲突时在不同的分支中修改了同一个文件的同一部分,程序无法把两份有差异的文件合并,这时候需要人为的干预解决冲突.当前处于master 分支,当dev 分支和master ...
- Java并发专题 带返回结果的批量任务执行
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是R ...
- iOS开发 Xcode8 问题
一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automatically manage signing(Ps.但是在b ...
- PopupWindowFromBottom 从底部弹出popupwindow
自定义PopupWindowFromBottom public class PopupWindowFromBottom extends PopupWindow { public PopupWindow ...
- centos7.0 增加/usr分区的容量减少home分区的大小
把/home内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/root文件系统,新建/home:tar cvf /tmp/home.tar /home #备份/homeumount /home ...
- Java学习笔记——java介绍
Java开源语言 C语言闭源语言 IOS闭源系统 采用object-c语言开发 应用程序分类(从类型分类) C/S(Client Server):不联网的软件也属于C/S B/S(Browser S ...
- [转]React表单无法输入原因----约束性和非约束性组件
转自:http://blog.csdn.net/lihongxun945/article/details/46730835 表单是前端非常重要的一块内容,并且往往包含了错误校验等逻辑. React对表 ...
- iOS GPUImage 滤镜介绍
这里直接引用官方描述: The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated ...
- [note]树链剖分
树链剖分https://www.luogu.org/problemnew/show/P3384 概念 树链剖分,是一种将树剖分成多条不相交的链的算法,并通过其他的数据结构来维护这些链上的信息. 最简单 ...