Python 检查自';带有时区的时间戳';格式

Python 检查自';带有时区的时间戳';格式,python,time,Python,Time,我用Django创建了一个db记录,其中有一个“created_at”字段,格式为“timestamp with time zone”:2017-01-13 14:12:18.307877+00:00 我需要检查从那时到现在是否已经过去了30秒。 我应该先把它转换成大纪元时间吗?如果是,如何避免时区问题?如果这是一个datetime对象,那么您可以减去另一个datetime对象并获得一个timedelta,您可以在其中询问经过的时间 d1=datetime(2017,1,1)#在2017-01-

我用Django创建了一个db记录,其中有一个“created_at”字段,格式为“timestamp with time zone”:2017-01-13 14:12:18.307877+00:00

我需要检查从那时到现在是否已经过去了30秒。
我应该先把它转换成大纪元时间吗?如果是,如何避免时区问题?

如果这是一个datetime对象,那么您可以减去另一个datetime对象并获得一个timedelta,您可以在其中询问经过的时间

d1=datetime(2017,1,1)#在2017-01-01T00:00创建日期时间

d0=datetime.now()

diff=(d0-d1)。秒

如果差异>30:

pass

datetime方法采用可选的tzinfo,您可以使用该选项设置时区。这只是datetime.tzinfo的一个子类

GMT+1的示例

 class GMT1(tzinfo):
     def utcoffset(self, dt):
         return timedelta(hours=1) + self.dst(dt)
     def dst(self, dt):
         # DST starts last Sunday in March
         d = datetime(dt.year, 4, 1)   # ends last Sunday in October
         self.dston = d - timedelta(days=d.weekday() + 1)
         d = datetime(dt.year, 11, 1)
         self.dstoff = d - timedelta(days=d.weekday() + 1)
         if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:
             return timedelta(hours=1)
         else:
             return timedelta(0)
     def tzname(self,dt):
          return "GMT +1"
用绳子

2017-01-13 14:12:18.307877+00:00
我们可以使用该函数生成一个
datetime
对象,然后用它进行时间运算

首先,我们删除最后一个
,因为
datetime
使用的时区格式是
+0000
而不是
+00:00
。然后我们将该字符串连同一个格式字符串一起交给
strtime

from datetime import datetime, timedelta
s = '2017-01-13 14:12:18.307877+00:00'
s = s[:-3]+s[-2:]
pat = '%Y-%m-%d %H:%M:%S.%f%z'
then = datetime.strptime(s, pat)
if datetime.now(then.tzinfo) - then < timedelta(0, 30): 
    print("It has been less than 30 seconds")
从datetime导入datetime,timedelta
s='2017-01-13 14:12:18.307877+00:00'
s=s[:-3]+s[-2:]
pat=“%Y-%m-%d%H:%m:%S.%f%z”
然后=datetime.strtime(s,pat)
如果datetime.now(then.tzinfo)-then
使用模块转换为datetime对象,然后可以进行减法和比较。如果从时区中删除
,则这是
datetime.datetime.StrTime('2017-01-13 14:12:18.307877+0000','%Y-%m-%d%H:%m.%S.%f%z')
这是否与时区有关?@Tagc它使用运行操作系统定义的默认时区。但我更新了答案,将计数时区考虑在内。
from datetime import datetime, timedelta
s = '2017-01-13 14:12:18.307877+00:00'
s = s[:-3]+s[-2:]
pat = '%Y-%m-%d %H:%M:%S.%f%z'
then = datetime.strptime(s, pat)
if datetime.now(then.tzinfo) - then < timedelta(0, 30): 
    print("It has been less than 30 seconds")