2017-01-13 122 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它使用正在運行的操作系統定義的默認值。但我更新了計算時區的答案。 –

相關問題