web-dev-qa-db-ja.com

pytzおよびastimezone()は、単純な日時には適用できません

日付があり、タイムゾーンを認識させる必要があります。

local_tz = timezone('Asia/Tokyo')
start_date = '2012-09-27'
start_date = datetime.strptime(start_date, "%Y-%m-%d")   
start_date = start_date.astimezone(local_tz)


now_utc = datetime.now(timezone('UTC'))
local_now = now_utc.astimezone(local_tz)

これが真実かどうかを見つける必要があります:

print start_date>local_now

しかし、私はこのエラーを受け取ります。

   start_date = start_date.astimezone(local_tz)
   ValueError: astimezone() cannot be applied to a naive datetime

Utcを東京に問題なく変換します。東京でstart_dateタイムゾーンを認識する広告を作成する必要があります。

ありがとう

49
Tampa

pytzタイムゾーンの場合、.localize()メソッドを使用して、単純なdatetimeオブジェクトをタイムゾーンを持つものに変換します。

_start_date = local_tz.localize(start_date)
_

DSTトランジションのないタイムゾーンの場合、 .replace() method は、タイムゾーンを単純なdatetimeオブジェクトにアタッチするために通常機能するはずです:

_start_date = start_date.replace(tzinfo=local_tz)
_

詳細については、pytzのドキュメントの ローカライズされた時刻と日付の計算 を参照してください。

48
Martijn Pieters

local_tz.localize(naive_dt, is_dst=None)を使用して、単純なdatetimeオブジェクトをタイムゾーン対応オブジェクトに変換できます。

from datetime import datetime
import pytz

local_tz = pytz.timezone('Asia/Tokyo')

start_date = local_tz.localize(datetime(2012, 9, 27), is_dst=None)
now_utc = datetime.utcnow().replace(tzinfo=pytz.utc)

print start_date > now_utc

is_dst=Noneは、指定されたローカル時間があいまいな場合に.localize()に強制的に例外を発生させます。

15
jfs

Django Rest Frameworkを使用している場合、次のようにDateTimeFieldクラスをオーバーライドできます。

class DateTimeFieldOverridden(serializers.DateTimeField):

def to_representation(self, value):
    local_tz = pytz.timezone(TIME_ZONE)
    value = local_tz.localize(value)
    return super(DateTimeFieldOverridden, self).to_representation(value)

そして、あなたはあなたのシリアライザで次のようにそれを使用します:

date_time = DateTimeFieldOverridden(format='%d-%b-%Y', read_only=True)

これが誰かを助けることを願っています。

0
Joseph Daudi