2016-02-06 6 views
1
setings.py:- 
    USE_TZ = True 
    TIME_ZONE = 'America/Chicago' 

class MyModel(models.Model): 

     created_at = models.DateTimeField(auto_now_add=True) 
     # time zone related field 
     user_time_zone = models.CharField(max_length=255, null=True, blank=True) 
     time_difference = models.CharField(max_length=255, null=True, blank=True) 
     client_date = models.DateTimeField(null=True, blank=True) 
     display_date = models.DateTimeField(null=True, blank=True) 

MyModel object create 

MyModel.objects.create(user_time_zone=form.cleaned_data['prefer_time_zone']) 


Signal called after the MyModel is created 

def update_time_zone(sender, instance, created, **kwargs): 

    if created: 

     fmt = "%Y-%m-%d %H:%M:%S %Z%z" 

     now_utc = instance.created_at 

     if instance.user_time_zone: 

      if instance.user_time_zone == 'US/Alaska': 

       alaska = now_utc.astimezone(timezone('US/Alaska')) 
       print "alaska is_aware", is_aware(alaska) 
       print "alaska is_naive", is_naive(alaska) 

       instance.client_date = alaska 
       instance.display_date = alaska 
       instance.time_difference = alaska.strftime(fmt).split(" ")[2] 
       instance.save() 

       print "alaska now utc", type(now_utc) 
       print "alaska type", type(alaska) 

       print "alaska", alaska 

       # At here i got updated value but when i see inside 
       # postgres database value is not updated 

       print "instance.client_date", instance.client_date 
       print "us/alaska", alaska.strftime(fmt) 

signals.post_save.connect(update_time_zone, sender=MyModel) 


instance.created_at = 2016-02-06 21:42:22.552000+00:00 
alaska = 2016-02-06 12:42:22.552000-09:00 

Выпуск: -Джанго DateTime поле не обновляется с использованием временной зоне

После преобразования instance.created_at в 'США/Alaska' выход 2016-02-06 12: 42: 22.552000-09: 00. Но когда я делаю client_date и display_date равными аляске, как в приведенном выше сигнале, он не сохранил обновленное значение alaska, а затем обновил client_date и display_date значением instance.created_at, добавив 5 часов. Мне нужно обновить client_date и display_date по часовому поясу аляски.

Когда я вызываю instance.save(), это не влияет на базу данных postgres. В чем проблема? Почему он не обновляет значение аляски? есть ли что-нибудь вроде django force, чтобы не обновлять новое значение, а обновлять значение, используя часовой пояс по умолчанию?

+0

проверить эти? http://stackoverflow.com/questions/19505640/django-saving-datetime-based-on-per-object-timezone и http://www.saltycrane.com/blog/2009/05/converting-time-zones- datetime-objects-python/ –

+0

Да, я слежу за блоком saltycrane. Но client_date и display_date не обновляют часовой пояс аляски. Даже я преобразовал, он не имеет никакого эффекта внутри базы данных. –

ответ

0

часовой пояс-Aware DateTime объекты .. 00:00:00+00:00 и .. 01:00:00+01:00 соответствуют точно тот же момент времени,. Они отображаются только по-разному. В Django a datetime represents a point in time. It’s absolute: it doesn’t depend on anything.

dt = dt.astimezone(whatever_tz) не влияет на значение в базе данных. The database connection’s time zone is set to UTC (USE_TZ=True). Если вам нужно сохранить информацию о часовом поясе client_date; хранить его отдельно.