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时间、本地时间及时间戳转化的更多相关文章

  1. UTC时间 GMT时间 本地时间 北京时间 时区 夏令时简要说明

    1.UTC时间 与 GMT时间 整个地球分为二十四时区,每个时区都有自己的本地时间.为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated). ...

  2. UTC 转本地时间

    String dateStr = "Wed Dec 10 00:00:00 UTC 0800 2014"; //Wed Dec 10 00:00:00 UTC 0800 2014 ...

  3. UTC与本地时间字符串互相转换

    #!/usr/bin/env python import time import datetime # 格式自改 UTC_FORMAT = '%Y-%m-%dT%H:%M:%SZ' LOCAL_FOR ...

  4. Sql Server 的本地时间和UTC时间

    一,本地时间和UTC时间 本地时间 世界的每个地区都有自己的本地时间,整个地球分为二十四时区,每个时区都有自己的本地时间. UTC时间 在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用协调时 ...

  5. UTC、GTC时间和本地时间

    1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...

  6. 关于UTC时间和本地时间

    收藏了个类Publics  可以实现本地时间和UTC时间的转换 UCT时间=本地时间-8    本地时间比UTC时间快8小时 element-ui的日期选择器上  选择的时间显示的是本地时间   但实 ...

  7. QDateTime 本地时间和UTC时间转换问题

    先说一下UTC,搜索360百科: 协调世界时,又称世界统一时间.世界标准时间.国际协调时间,简称UTC,是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统.1979年12月3日在内瓦举行 ...

  8. UTC、GTC时间和本地时间(Linux默认使用UTC时间,要修改一下)

    1.问题 对于装有Windows和Linux系统的机器,进入Windows显示的时间和Linux不一致,Linux中的时间比Windows提前8个小时. 2.解决方法 修改/etc/default/r ...

  9. scala 时间,时间格式转换

    scala 时间,时间格式转换 1.scala 时间格式转换(String.Long.Date) 1.1时间字符类型转Date类型 1.2Long类型转字符类型 1.3时间字符类型转Long类型 2. ...

随机推荐

  1. 转载:SQL 字符串操作函数

    http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 以下所有例子均Studnet表为例:  计算字符串长度len()用来 ...

  2. 《转》PyQt4 精彩实例分析* 实例2 标准对话框的使用

    和大多数操作系统一样,Windows及Linux都提供了一系列的标准对话框,如文件选择,字体选择,颜色选择等,这些标准对话框为应用程序提供了一致的观感.Qt对这些标准对话框都定义了相关的类.这些类让使 ...

  3. lucas定理证明

    Lucas 定理(证明) A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])* ...

  4. 怎样过滤跨站恶意脚本攻击(XSS)

    什么是XSS? XSS(Cross Site Scripting),即跨站脚本攻击,是一种常见于web application中的计算机安全漏洞.XSS通过在用户端注入恶意的可运行脚本,若服务器端对用 ...

  5. WCF基础之Message类

    客户端和服务端的通信都是通过接收和发送的Message实例建立起来的,大多数情况我们通过服务协定.数据协定和消息协定来构造传入和传出消息的. 一般什么时候使用Message类呢?不需要将消息序列化或者 ...

  6. BZOJ3211花神游历各国

    BZOJ3211花神游历各国 BZOJ luogu 分块 记一个all表示该块是否全部<=1,如果all不为真就暴力修改 因为一个数被开根的次数不多,即使\(10^{12}\)只要开根6次也会变 ...

  7. 如何更改CSDN博客高亮代码皮肤的样式,使博客看起来更有范(推荐)

    由于本人写博客的时候,也没有配置博客的相关属性,因此贴出来的代码块都是CSDN默认的,因此代码背景色都是白色的,如下所示: 但是本人在浏览他人博客的时候,发现有些博客的代码块看起来比较有范,整个代码库 ...

  8. pg 和sql server 分别如何新建二进制数据库字段以及插入二进制数据的sql语句

    PG create table demo ( id int, name bytea ); Insert into demo (id,name)values(256,pg_read_binary_fil ...

  9. 编程算法 - 最好牛线(Best Cow Line) 代码(C)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/37909933 最好牛线(Best Cow L ...

  10. c#命名规则参考

    命名规则参考:1.从组件类型名中移去T前缀.例如TButton变成Button.2.除了第一个元音,删去所有元音字母.例如,Button变成bttn,Edit变成edt.3.压缩双字母.例如,bttn ...