我有一个使用 Django 创建的数据库记录,其中有一个"created_at"字段,格式为"时区时间戳":2017-01-13 14:12:18.307877+00:00。
我需要检查从那个时间到现在是否已经过去了 30 秒。我应该先将其转换为纪元时间吗?如果是,如何,而不会受到时区问题的打击?
使用字符串
2017-01-13 14:12:18.307877+00:00
我们可以使用 datetime.datetime.strptime
函数生成一个 datetime
对象,然后我们可以用它来进行时间算术。
首先,我们删除最后一个:
,因为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")
如果这是一个日期时间对象,那么你可以减去另一个日期时间对象并得到一个时间增量,你可以在其中询问经过的时间。
d1 = datetime(2017, 1, 1) # create datetime at 2017-01-01T00:00
d0 = datetime.now()
diff = (d0 - d1).seconds
if diff > 30:
pass
datetime 方法采用可选的 tzinfo,您可以使用设置时区。这只是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())