1

私は自分のプロジェクトのニュースブログを作成しています。このブログでは、ニュースタイトルの下にx分前などの時間を表示する必要があります。

ニュースのRSSフィードから、文字列の形式のタイムスタンプがあります。例えば:

タイムスタンプ='2013年2月12日火曜日07:43:09GMT'

Pythonのdatetimeモジュールを使用して、このタイムスタンプと現在の時刻の違いを見つけようとしています。しかし、何らかの理由でエラーが発生します。

ValueError:astimezone()をナイーブな日時に適用することはできません

誰かが私を正しい方向に向けることができれば幸いです。以下はPythonでの私の試みです:

from datetime import datetime
from pytz import timezone
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT'  
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z')
now_time = datetime.now(timezone('US/Pacific'))
# converting the timestamp to Pacific time
t_pacific = t.astimezone(timezone('US/Pacific'))   # get error here
diff = t_pacific - t

ありがとう!プラカール

4

2 に答える 2

3

あなたの例にはいくつかの問題がありました(私はあなたが今それらを修正したと思います):

  • 最初の行は次のようになります。

    from datetime import datetime
    
  • 4行目の閉じ括弧が欠落しているように見えます。

    now_time = datetime.now(timezone('US/Pacific')
    
  • timezone()ですか?それはどこから来るのですか?

タイムゾーンをいじる必要はありません。GMT(UTC)を使用するだけです。このようなものはどうですか?

from datetime import datetime
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT'  
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z')
t_now = datetime.utcnow()
diff = t_now - t
于 2013-02-12T23:40:25.493 に答える
2

ここでの問題tは、タイムゾーンがないことです。これが、「ナイーブ日時」のエラーメッセージの意味です。ドキュメントから:

日付と時刻のオブジェクトには、「ナイーブ」と「アウェア」の2種類があります。アウェアオブジェクトには、タイムゾーンと夏時間の情報に関する十分な知識があります。ナイーブオブジェクトにはありません。</ p>

これを行うことで、それがナイーブであることを確認できます。

print(t.tzinfo)

答えはになりますNone

astimezoneドキュメントが言うように:

self知っている必要があります(であってself.tzinfoはならずNoneself.utcoffset()戻ってはなりませんNone)。

このstrptime関数は常に単純な日時を生成します。

これはさまざまな方法で修正できます。

  • 最初tに、単純な日時ではなくGMT日時に変換してから、への変換'US/Pacific'が機能します。

ドキュメントに記載されているように、「日付と時刻のデータを調整せずに、単にタイムゾーンオブジェクトtzを日時dtにアタッチする場合は、を使用しますdt.replace(tzinfo=tz)。」時刻がUTCであることがわかっているので、UTCをreplace含む空のtzだけで、認識された時刻が得られます。

  • とは異なるメカニズムでPSTに変換します。このメカニズムではastimezone、UTCを想定するか、ソースを指定できます。

そこにはさまざまな選択肢がありますが、すでに使用しているので、そのドキュメントpytzを参照してください。

  • PSTに変換する代わりnow_timeにUTCに変換します。t

最後の1つは、おそらく最も単純で、ほとんどのユースケースに最適です。PSTは、明示的にそのように要求したために取得now_timeしただけなので、実行する必要があるのはそれを実行することだけではありません(または、'GMT'代わりに明示的に要求します'US/Pacific')。次に、UTC時間で日付演算を実行できます。

最終結果をPSTで表示する必要がある場合でも、UTCで算術演算を実行し、最後に変換する方がよい場合がよくあります。(たとえば、1時間間隔で2回設定できますが、夏時間の午前1時が2回繰り返されるため、太平洋では同じ値になります。UTCに常に滞在している場合は問題になりません。)

于 2013-02-12T23:53:46.443 に答える