2011-01-26 6 views
11

참고 : 이전에 존재하고 관련 정보 만 제공하므로 질문을 삭제했습니다.Django : 시간대 문제

데이터베이스 서버 (RH)의 TIME_ZONE = "Europe/London"이 지정되었습니다. Django settings.py에서는 TIME_ZONE = "America/New_York"을 지정합니다.

그리고는 내 모델 클래스에 내가 지정한 :

created = models.DateTimeField(editable=False,auto_now=False, auto_now_add=True) 
modified = models.DateTimeField(editable=False,auto_now=True, auto_now_add=True) 

그때 관리자 사이트의 데이터를 볼 갈 때, 내가 대신 동부의 UTC/GMT 시간을 얻을.

"America/New_York"를 Django의 시간대로 지정 했으므로 모든 시간이 Django에 의해 자동으로 조정되는 것으로 생각했습니다.

도움/설명을 제공해 주시면 감사하겠습니다.

감사 에릭 당신이 질문을 편집 때문에

+0

이걸 어떻게해야합니까? >>> import datetime >>> datetime.datetime.now() –

+0

방금 ​​SERVER 정보를 업데이트했습니다. 표준 시간대는 On Server Europe/London으로 설정됩니다. –

+0

AUTO_NOW를 사용하지 않습니다. 표준 시간대를 설정해야하는 데이터베이스 서버에 위임합니다. 이 방법으로 사용자가 다른 시간대를 가질 수있는 유연성을 잃을 수 있습니다. –

답변

10

날짜/시간 'automagic'에 의존하는 것은 위험하며 이러한 auto_add 모델 매개 변수는 함정입니다. 항상 귀하가 상대하는 표준 시간대를 이해하십시오. 파이썬은 datetime 객체에 tzinfo 멤버를 첨부함으로써 더 쉽게 만듭니다. 이러한 개체는 기본적으로 '순진'이지만 항상 tzinfo 세부 정보를 첨부하는 것이 좋습니다. 아직도 파이썬은 python-dateutil 또는 pytz (내가 사용하는 것) 중 하나를 사용하여 도움이 필요합니다. 여기에 보편적 인 규칙이 있습니다 - 항상 당신의 datetimes를 데이터베이스에 UTC로 저장하십시오.

왜? 귀하의 사용자가 다른 지역, 휴대 전화 및 노트북 여행에있을 수 있으며, 서버가 다른 시간대에 잘못 구성되거나 미러링 될 수 있습니다. 너무 많은 두통. Datetimes는 절대 순진하지 않아야하며 (데이터베이스에서와 같이) 컨텍스트가 필요한 경우 테이블에 시간대 필드도 포함해야합니다.

귀하의 경우.

  1. auto_now 필드를 사용하지 말고 대신 사용자 정의 save()를 사용하십시오.
  2. 데이터베이스에 UTC 저장
  3. 시간대 (예 : 사용자 이벤트)를 알고 싶다면 데이터베이스에 시간대를 저장하십시오. 당신이 pytz를 사용하는 경우
  4. 가 필요/요구 시간대

로 변환의 localize() 방법은 중대하다. 파이썬의 datetime 객체는 유용한 replace()와 astimezone()을 가지고 있습니다.

데이터베이스가 데이터베이스와 비슷하지 않은 경우 (예 : MySQL) datetime이 UTC인지 확인한 다음 replace (tzinfo = None)를 사용하십시오. 데이터베이스 커넥터가 tz 인식 객체를 처리 할 수 ​​없기 때문입니다.

여기에 thread이 있으며 장고의 auto_now 필드에 대한 세부 정보가 있습니다.

0

, 나는 장고 당신 dB의 시간대를 제어 할 수 없습니다 :) 내 대답을 편집 할 수 있습니다, 그래서이 문제를 해결하는 방법은 DB의 시간대를 업데이트하는 것입니다 . MySQL의 경우,이 쿼리를 실행 : 이것은 귀하의 경우 "유럽/런던"을 의미 기본적하고 문제의 원인에 의해 SYSTEM, SYSTEM를 반환해야

SELECT @@global.time_zone, @@session.time_zone;

. 이제 당신이 확인한 것으로,이 페이지의 첫 번째 주석의 지시 사항을 따르십시오 : 당신이 변경 사항을 적용하기 위해 시간대를 업데이트 한 후

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

는 MySQL 서버를 다시 시작해야합니다.

+0

DB가 시간대 오프셋을 저장하는 한 (Postgres는 "타임 스탬프가있는 타임 스탬프"데이터 유형으로 이것을 수행합니다) 장고는 DB 설정에 신경 쓰지 않아야합니다. Django는 상당히 DB에 무관 한 것으로 간주되지만, Eric은 디버깅에 도움이되는 실행중인 DB 서버 (이름과 버전)를 지정해야합니다. – drdaeman

1

auto_now_add = True라고 말하면 값은 데이터베이스 서버가 아니라 장고 서버에 추가됩니다. 따라서 데이터베이스 서버에 시간대를 설정해야합니다.

3

먼저 데이터를 UTC로 저장하면 좋은 출발점이됩니다.

그래서 내가 EST에서 시간을 필요로합니까, 최종 사용자에게 이것을 요구합니까, 아니면 서버에서 논리를 수행하고 EST에서 필요합니까?

최종 사용자의 경우 쉽게 해결하면 사용자 브라우저가 올바른 시간으로 변환하도록 처리 할 수 ​​있습니다. 당신은 시간을 가지고 싶다면, 다른 한편으로는, 지금

var date_obj = new Date({{ timestamp }}); 
var datetime_string = date_obj.toString(); 
// the datetime_string will be in the users local timezone 

:

timestamp = time.mktime(datetime_obj.timetuple()) * 1000 

을 그리고 웹 페이지에 날짜 개체를 인스턴스화 : 서버에서 타임 스탬프로 날짜 개체를 변환 서버의 올바른 영역에서 논리를 수행 할 수 있습니다. python-dateutil의 도움을 사용하는 것이 좋습니다. 그것은 당신이 쉽게 다른 시간대로 교환 할 수 있습니다 : 당신이 정말로 싶어 EST에서 날짜를 저장하는 경우

from datetime import datetime 
from dateutil import zoneinfo 

from_zone = zoneinfo.gettz('UTC') 
to_zone = zoneinfo.gettz('America/New_York') 

utc = created # your datetime object from the db 


# Tell the datetime object that it's in UTC time zone since 
# datetime objects are 'naive' by default 
utc = utc.replace(tzinfo=from_zone) 

# Convert time zone 
eastern_time = utc.aztimezone(to_zone) 

지금, 당신은 (아제 야다 브 및 gorus 말했다 같은) DB 서버에서 시간을 변경해야합니다. 왜 당신이 그들을 EST로 저장하고 싶은지 모르겠지만 다시 당신의 응용 프로그램이 무엇인지 모르겠습니다.

+0

토드, 제 질문이 완전하지 않았던 것 같아요. 그러나 나는 당신의 요점을보고 좋은 점들입니다. 현재 프로젝트에서 예제를 사용하려고합니다. 감사! –