2017-01-13 75 views
0

我有一个用Django创建的带'created_at'字段的'db'记录,格式为'timestamp with time zone':2017-01-13 14: 12:18.307877 + 00:00。检查自'timestamp with time zone'格式以来XX秒是否已经过去了

我需要检查在这段时间和现在之间是否经过了30秒。 我应该先将它转换为纪元时间吗?如果是的话,如何不受时区问题的打击?

+0

使用[日期时间](https://docs.python.org/3/library/datetime.html)模块转换为日期时间对象,然后您可以减去并进行比较。 – wwii

+0

如果您从时区删除':',那么这是'datetime.datetime.strptime('2017-01-13 14:12:18.307877 + 0000','%Y-%m-%d%H: %M:%S.%f%z')' –

回答

0

以字符串

2017-01-13 14:12:18.307877+00:00 

我们可以使用datetime.datetime.strptime函数产生一个datetime对象,然后我们可以做时间算术wi日。

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

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") 
0

如果这是一个日期时间对象,那么你可以减去另一个日期时间对象并获得一个timedelta,在那里你可以问逝去的时间。

d1 = datetime(2017, 1, 1) # create datetime at 2017-01-01T00:00

d0 = datetime.now()

diff = (d0 - d1).seconds

if diff > 30:

pass

日期时间的方法有一个可选的tzinfo,您可以使用该设置时区。这仅仅是一个与GMT datetime.tzinfo

实例的子类+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" 

然后,你可以做

d0 = datetime(2017, 1, 1, tzinfo=GMT1()) 
+1

虽然这方面的时区吗? – Tagc

+0

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior – wwii

+0

@Tagc它使用正在运行的操作系统定义的默认值。但我更新了计算时区的答案。 –

相关问题