pytz and astimezone() cannot be applied to a naive datetime

前端 未结 3 912
一整个雨季
一整个雨季 2020-12-02 20:02

I have a date and I need to make it time zone aware.

local_tz = timezone(\'Asia/Tokyo\')
start_date = \'2012-09-27\'
start_date = datetime.strptime(start_dat         


        
相关标签:
3条回答
  • 2020-12-02 20:18

    You could use local_tz.localize(naive_dt, is_dst=None) to convert a naive datetime object to timezone-aware one.

    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 forces .localize() to raise an exception if given local time is ambiguous.

    0 讨论(0)
  • 2020-12-02 20:27

    For pytz timezones, use their .localize() method to turn a naive datetime object into one with a timezone:

    start_date = local_tz.localize(start_date)
    

    For timezones without a DST transition, the .replace() method to attach a timezone to a naive datetime object should normally also work:

    start_date = start_date.replace(tzinfo=local_tz)
    

    See the localized times and date arithmetic of the pytz documentation for more details.

    0 讨论(0)
  • 2020-12-02 20:39

    If you are using Django Rest Framework you could override the DateTimeField class like:

    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)
    

    And you use it like this in your serializer:

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

    Hope this helps someone.

    0 讨论(0)
提交回复
热议问题