2016-07-15 2 views
0

로깅 다이빙 용 Django 앱을 개발 중이며 각 다이빙에는 datetime과 시간대가 있습니다. 시간대에 django-timezone-field 앱을 사용하고 있습니다.Django에서 주어진 시간대를 사용하여 시간 표시

class Dive(models.Model): 
    ... 
    date_time_in = models.DateTimeField(default=timezone.now) 
    timezone = TimeZoneField(default=timezone.get_current_timezone_name()) 

그래서 사용자가 날짜 문자열을 입력 할 수 있습니다 ("2016년 7월 11일 14시")와 시간대 ("아시아/방콕"- + 세계 협정시 07시)를 선택, 나는 그 시간대를 설정 데이터베이스는 다음 (SELECT 문 내 로컬 시간대에 있습니다) 데이터베이스에 UTC로 날짜를 저장

def log_dive(request): 
    if request.method == 'POST': 
    form = DiveForm(request.POST) 
    if form.is_valid(): 
     dive = form.save(commit=False) 
     date = dive.date_time_in 
     date = date.replace(tzinfo=None) 
     dive.date_time_in = dive.timezone.localize(date) 
     dive.save() 

: : 이제

# SELECT date_time_in, timezone FROM divelog_dive ORDER BY number DESC; 
     date_time_in  |  timezone  
------------------------+------------------ 
2014-07-11 17:00:00+10 | Asia/Bangkok 

같이 내보기에 주어진 일에 날짜의 내가 고생하고있는 두 가지가있다. iith :

1) 주어진 시간대로 날짜를 표시하고 싶지만 TIME_ZONE 설정을 기본값으로 중지 할 수 없습니다.

2) 사용자가 레코드를 편집하는 경우 편집 필드에 표시된 시간은 원래 입력 된 시간 (14:00)이어야하며 현재 시간대 (17:00)에 표시됩니다.

답변

0

는 파일 설정에 USE_TZ이 = 사실이 있습니까

0

settings.py에서 시간대 설정을 확인? djangoadmin-startproject 명령을 사용하여 앱을 만든 경우 기본적으로 설정됩니다.

또한 필자는 마지막 작업에서 시간대와 어려움을 겪었지만 pytz를 사용하면 실제로 도움이되었습니다. 아직 그 패키지를 사용해 보셨습니까?

편집 : 좋아, 사람이 내가 해제 방법이 될 수 있지만, 아무도 이후 다른

당신은 tz_info = 없음으로 날짜 객체를 교체 ... 여기에 내가 눈치 뭔가 대답 나는 시간대 투쟁을 느낄 수있다, 하지만 당신은 그 대신에 데이터베이스에서 시간대로 교체하고 싶지 않을까요? 그래서 당신은 그 시간대를 얻고 유효한 포맷 (tzinfo = blah ...)을 사용하여 대체 할 것인가? 내가 말했듯이 나는 벗어날 수 있지만 그곳에서 도움이된다면.

+0

감사합니다, 지금 그것을 알아 냈어요, 내가 게시 된 코드는'(= 없음 tzinfo) 교체'후 날짜, 선을 저장하기위한 올바른 시간대를 사용자가 선택한 시간대로 설정합니다 (dive.timezone은 pytz 시간대 객체 임). – xeonman9000

0

죄송합니다. 내 문제를 아주 잘 설명했다고 생각하지 않습니다. 나는 마침내 이것을 알아 냈으므로 나는 내 자신의 질문에 대답 할 것이다.

1) 쉽게 밝혀졌다, 장고는 주어진 영역에 시간을 표시하기위한 템플릿 태그가 : 2의

{{ dive.date_time_in|timezone:dive.timezone|date:"Y-m-d H:i e" }} 

)를, 내가 건너 온 [1]이 솔루션에 저를지도한다 :에서 뷰는 데이터베이스에서 객체를 가져온 후 astimezone (...)을 사용하여 DB가 UTC로 저장하는 날짜 값을 주어진 시간대로 변환합니다. 그런 다음 replace (tzinfo = None)를 사용하여 순진하게 만든 다음 양식에 올바르게 표시합니다.

def edit_dive(request, dive_id=None): 
    dive = None 
    if dive_id != None: 
    dive = get_object_or_404(Dive, pk=dive_id) 
    local_date = dive.date_time_in.astimezone(timezone(str(dive.timezone))) 
    dive.date_time_in = local_date.replace(tzinfo=None) 

[1] 당신의 도움 크리스 http://www.saltycrane.com/blog/2009/05/converting-time-zones-datetime-objects-python/

관련 문제