Rozumiem, że najlepszą praktyką teraz z Django 1.4 jest przechowywanie wszystkich datetime
w UTC i zgadzam się z tym. Rozumiem też, że wszystkie rozmowy stref czasowych powinny być wykonywane na poziomie szablonu tak:Jak uzyskać aktualną strefę czasową odwiedzającego, a następnie przekonwertować timezone.now() na ciąg czasu lokalnego w Django 1.4?
{% load tz %}
{% timezone "Europe/Paris" %}
Paris time: {{ value }}
{% endtimezone %}
Jednak muszę konwertować czasu UTC na czas lokalny request
wszystko jest w Pythonie. Nie mogę używać znaczników szablonów, ponieważ zwracam ciąg znaków w JSON, używając Ajax (dokładniej: Dajaxice).
Obecnie jest to mój kod ajax.py
:
# checked is from the checkbox's this.value (Javascript).
datetime = timezone.now() if checked else None
$ order_pk is sent to the Ajax function.
order = Order.objects.get(pk=order_pk)
order.time = datetime
order.save()
return simplejson.dumps({
'error': False,
'datetime': dateformat.format(datetime, 'F j, Y, P') if checked else 'None'
})
Więc nawet jeśli obecny czas jest April 14, 2012, 5:52 p.m.
czasu EST (mój lokalnej strefy czasowej), odpowiedź JSON powróci April 14, 2012, 9:52 p.m
, bo to jest czas UTC.
Również zauważyłem, że Django przechowuje zmiennej szablonu o nazwie TIME_ZONE
na każde żądanie (w rzeczywistości nie jest częścią zmiennej request
), więc skoro mój jest America/New_York
, jestem przy założeniu, że Django może dowiedzieć się każdy odwiedzający własną lokalną strefę czasową (w oparciu w nagłówku HTTP)?
W każdym razie, więc moje pytanie jest dwojaki:
- Jak uzyskać lokalną strefę czasową odwiedzającego w moim
ajax.py
? (Prawdopodobnie przekazać go jako argument łańcuchowy, taki jak{{ TIME_ZONE }}
) - W lokalnej strefie czasowej gościa, jak przekonwertować UTC
timezone.now()
na lokalną strefę czasową i wypisać jako ciąg znaków przy użyciu Django:dateformat
?
EDIT: dla @agf
timezone.now()
daje czas UTC, kiedy USE_TZ = True
:
# From django.utils.timezone
def now():
"""
Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
Czy mimo przekonwertować datetime
do czegoś innego niż UTC? Na przykład, czy mogę zrobić coś takiego, jak current_time = timezone.now()
, a następnie current_time.replace(tzinfo=est)
(EST = Eastern Standard Time)?
Cóż ja najpierw trzeba zrobić 'timezone.now()' 'przed timezone.activate (TZ)' i przechowywać że do 'order' pierwszego prawa? Ale wtedy będzie 2 różne 'datetime'. – hobbes3
@ hobbes3, jeśli chcesz mieć domyślną strefę czasową dla domyślnej strefy czasowej, a następnie tak. Jeśli chcesz mieć godzinę czasu UTC uświadamiającą strefę czasową, a domyślną strefą czasową nie jest UTC, to musisz przekonwertować ją na UTC. – agf
@ hobbes3 Zawsze możesz użyć 'somedatetime.replace (tz = sometz)'. – agf