2017-12-22 21 views
1

私は単純なRSSリーダーを作成しています。最後に読み取られた最新のエントリの日付をnewest_entry_datetimeに保存して、チャンネルをもう一度読むとnewest_entry_datetimeの入力時刻と<という記号を比較しています.Pythonはdatetimeを認識して比較するのに十分なほどスマートです。Pythonの日付時刻と<戻り値が間違っています

時間部分が変化しているが、翌日には最新の日付が古いものとして実装されています。

import datetime 
import locale 

#locale.setlocale(locale.LC_ALL, 'English_United States.1252') 

newest_entry_datetime = 'Thu, 21 Dec 2017 16:02:03 CET' 
entry_published = 'Fri, 22 Dec 2017 08:19:15 CET' 

#dt_newest = datetime.datetime.strptime (newest_entry_datetime, "%a, %d %b %Y %H:%M:%S %Z") 

if (entry_published <= newest_entry_datetime): 
    print('Entry date is older') 
else: 
    print('Entry date is NEW') 

このようなコードでは、結果が得意です:"Entry date is older"これは間違っています。

第二のアイデアは、日時に日付スタンプを変換することでしたが、私は取得しています:

ValueError: time data 'Thu, 21 Dec 2017 16:02:03 CET' does not match format '%a, %d %b %Y %H:%M:%S %Z' 

私はアメリカにロケールを変更します場合でも。

正しく行う方法がわかりません。助けてもらえますか?

+1

貼り付けたコードにエラーがありません – user1767754

+1

タイムスタンプをエポックに変換して比較するのはなぜですか? –

+0

ちょうど数日前にCETについて同じ質問がありました。これは%Zで定義されていません。 –

答えて

1

datetimeに変換する前に "日付"を比較すると、文字列を比較します。最初にdatetimeに変換する必要があります(現時点でstring datetimeスタイルをサポートしていない場合は正しいフォーマットを使用します)。その後、2つのdatetimeオブジェクトを比較できます。 あなたはあなたがカスタムデシジョン(like this)できるタイムゾーンのために、 'CET'のためにこの形式にdatetimeに変換することはできません。

1

CETが認識されないAnton vBRのおかげで、フィードのタイムゾーンが常に同じになるので、この部分を削除しました。

正常に機能し、適切な結果が得られる最終コードはここにあります。

import datetime 
import locale 

locale.setlocale(locale.LC_ALL, 'English_United States.1252') 

newest_entry_datetime = 'Thu, 21 Dec 2017 16:02:03 CET' 
entry_published = 'Fri, 22 Dec 2017 08:19:15 CET' 

newest_entry_datetime = newest_entry_datetime.rsplit(" ", maxsplit=1)[0] 
entry_published = entry_published.rsplit(" ", maxsplit=1)[0] 
dt_newest = datetime.datetime.strptime (newest_entry_datetime, "%a, %d %b %Y %H:%M:%S") 
st_entry = datetime.datetime.strptime (entry_published, "%a, %d %b %Y %H:%M:%S") 

if (st_entry <= dt_newest): 
    print('Entry date is older') 
else: 
    print('Entry date is NEW') 

結果は次のとおりです:「エントリー日は予想通りです。

関連する問題