我有一個用Django創建的帶'created_at'字段的'db'記錄,格式爲'timestamp with time zone':2017-01-13 14: 12:18.307877 + 00:00。檢查自'timestamp with time zone'格式以來XX秒是否已經過去了
我需要檢查在這段時間和現在之間是否經過了30秒。 我應該先將它轉換爲紀元時間嗎?如果是的話,如何不受時區問題的打擊?
我有一個用Django創建的帶'created_at'字段的'db'記錄,格式爲'timestamp with time zone':2017-01-13 14: 12:18.307877 + 00:00。檢查自'timestamp with time zone'格式以來XX秒是否已經過去了
我需要檢查在這段時間和現在之間是否經過了30秒。 我應該先將它轉換爲紀元時間嗎?如果是的話,如何不受時區問題的打擊?
以字符串
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")
如果這是一個日期時間對象,那麼你可以減去另一個日期時間對象並獲得一個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())
使用[日期時間](https://docs.python.org/3/library/datetime.html)模塊轉換爲日期時間對象,然後您可以減去並進行比較。 – wwii
如果您從時區刪除':',那麼這是'datetime.datetime.strptime('2017-01-13 14:12:18.307877 + 0000','%Y-%m-%d%H: %M:%S.%f%z')' –