Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 절차지향
- AWS
- 멋쟁이사자처럼
- CRUD
- 파이썬 #백준 #BFS
- 서류전형
- spring-boot
- jwt
- 합격후기
- yolov5
- 솝트 후기
- 면접전형
- Java
- 인공지능
- 페이지네이션
- 멋사
- 백준
- EC2
- objectdetection
- 파이썬
- nodejs
- MongoDB
- 카카오
- 프로그래머스
- S3
- 사물인식
- 솝트
- 피로그래밍
- jQuery
- Python
Archives
- Today
- Total
찔끔찔끔씩😎
[Django] TIME_ZONE, USE_TZ 설정 (datetime 과 timezone) 본문
728x90
from datetime import datetime
from django.utils import timezone
datetime.now() # naive
timezone.now() # aware
장고 개발시에 aware 객체를 쓰는 것이 안전하다고 하는데
datetime 과 timezone 의 차이가 궁금했다.
계속 datetime 을 사용해왔기 때문..
1. navie datetime VS aware datetime
1) navie
- timezone 정보가 없음. ( 표준시간대가 없는 경우 )
- tzinfo 속성 설정되지 않음.
2) aware
- timezone 정보가 있음. ( 표준시간대가 세팅된 경우 )
- tzinfo 속성 설정되어 있음.
2. USE_TZ 설정
USE_TZ 값 | |
False | 장고는 내부적으로 Naive datetime 객체를 사용한다. 기준 시간대는 TIME_ZONE 이 된다. |
True | 장고는 내부적으로 Aware datetime 객체를 사용한다. 기준 시간대를 명확히 지정해 주어야 한다. 폼에 입력된 날짜 값은 Current time zone으로 해석한 뒤 Aware datetime 객체로 변환되고, 템플릿에 렌더링할 때는 Aware datetime 객체를 Current time zone으로 변환한다. ※ 만약 Naive datetime 객체를 사용하면 어떻게 될까? 하위호환성을 위해 Naive datetime 객체를 사용해도 문제가 없도록 설계가 되어 있다. 데이터베이스에 저장될 때 Naive datetime 객체를 Aware datetime 객체로 변환하고, 경고만 띄워준다. 하지만 그것도 DST 등으로 인한 문제가 발생할 여지는 있기 때문에, 항상 Aware datetime 객체를 사용하는 게 안전하다. |
3. 관련된 라이브러리
1) timezone.localtime(): 특정 시간대 기준 Aware 객체 -> TIME_ZONE 시간대 기준 Aware 객체
2) timezone.make_aware(): 시간대 기준이 없는 Naive 객체 -> TIME_ZONE 시간대 기준의 Aware 객체
from datetime import datetime, date, timedelta
from django.utils import timezone
import pytz
datetime.now() # Naive (TIME_ZONE)
datetime.now(pytz.UTC) # Aware (UTC)
timezone.now() # Aware (UTC)
timezone.localtime(datetime.now(pytz.UTC)) # Aware (UTC) → Aware (TIME_ZONE)
timezone.localtime(timezone.now()) # Aware (UTC) → Aware (TIME_ZONE)
timezone.make_aware(datetime.now()) # Naive (TIME_ZONE) → Aware (TIME_ZONE)
4. 예시 ) TIME_ZONE = 'Asia/Seoul' , USE_TZ = True
① datetime 객체를 사용할 땐 언제나 Aware 객체를 사용하자. timezone.now()가 권장된다.
② 그러면 DB에 저장되는 값도 UTC 기준 시간대로 저장되고, DB에서 값을 읽어올 때도 UTC 기준 시간대로 읽힌다.
③ 물론 템플릿에 렌더링 할 때는 알아서 한국 시간대로 변환이 되기 때문에 UTC라고 걱정할 필요는 없다.
④ 만약 UTC 기준 시간대의 Aware 객체를 한국 시간대의 Aware 객체로 변환하고 싶다면 timezone.localtime() 함수를 사용하자.
⑤ 참고로 DateField는 걱정하지 않고 사용해도 된다. 언제나 TIME_ZONE 기준 시간이 사용된다.
Comments