utc时间、本地时间及时间戳转化

一、时间戳的概念

时间戳的定义请看百科unix时间戳,须要注意的时间戳为当前时刻减去UTC时间(1970.1.1)零点时刻的秒数差,与当前系统所处的时区无关,同一时刻无论在任什么时候区下获得的时间戳都是同样的。python

最近由于存储数据库须要将时间转为时间戳的字节型来存储,用了python datetime模块,期间遇到一些问题,如今终于弄懂了时间戳、时间和UTC时间的正确转换关系,总结如下供你们参考。数据库

二、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时间:spa

    方式一:unix

   dt=datetime.datetime.now(timezone.utc)    #类型为aware datetime object,时区为utc
     dt.timestamp()                            #经过减去EPOCH获得时间戳

 方式二:code

   dt=datetime.datetime.utcnow()          #类型为naive datetime object,不包含时区信息
   dt.timestamp()                 #经过mktime获得时间戳(获得的时间戳是错误的 
  • 在未理解naiveaware以前,觉得两种方式得到时间戳都是同样的,不曾想第二种方式下再经过timestamp()得到的时间戳是错误的,为何会发生这种状况,是由于naive是不含时区的类型,而aware是有时区类型。
  • 第二种虽然和方式一得到的值是相同的,可是第二种方式不包含时区信息,在方式二下执行dt.timestamp(),timestamp()默认tz=None,即为本地时区,这样就会按照mktime获得秒数差,但其实此时dt倒是utc时间。而方式一有时区信息,执行dt.timestamp()是直接减去EPOCH时间。
  • 当时间值相同时,naive类型和aware类型时间下执行timestamp()结果是不同的,必定要注意,不能踩了这个坑,除非是本地时间,若是想经过其余时区的时间经过timestamp()获得时间戳,必定要带有时区信息。

3) 经过timestamp得出datetimeutc datetime

  • timestamp转datetime

   datetime.datetime.fromtimestamp(timestamp)         #得到本地时间,类型naive datetime obiect
  •  timestamp转utc datetime

两种方式得到utc时间,但datetime object类型不同。blog

方式一:get

   datetime.datetime.utcfromtimestamp(timestamp)     #类型naive datetime object

方式二:数学

   datetime.datetime.fromtimestamp(timestamp,timezone.utc)    #类型aware datetime object。   

三、总结:

  • timestamp没有时区之分,不要认为不一样时区有不一样的时间戳。
  • datetime object有两种类型,naive是不含时区的类型,而aware是有时区类型,就算显示的值同样,不一样类型的object也不能直接进行数学运算。
相关文章
相关标签/搜索