goodthings4me.tistory.com
파이썬 datetime 모듈과 장고(django) 시간대(use tz) 설정
▶ datetime 모듈
import datetime
import pytz
print('today:', datetime.datetime.today())
# today: 2021-08-25 08:23:35.425080
print('today_now:', datetime.datetime.now())
# today_now: 2021-08-25 08:23:35.426078
print('date:', datetime.date.today())
# date: 2021-08-25
today = datetime.datetime.today()
print('set_date:', datetime.datetime(today.year, today.month, today.day))
# set_date: 2021-08-25 00:00:00
print('set_datetime:', datetime.datetime(today.year, today.month, today.day, 11, 11, 1))
# set_datetime: 2021-08-25 11:11:01
print('set_datetime:', datetime.datetime(year=2021, month=8, day=20, hour=8, minute=20, second=45))
# set_datetime: 2021-08-20 08:20:45
print('set_datetime:', datetime.datetime(2021, 8, 20, 8, 20, 45))
# set_datetime: 2021-08-20 08:20:45
print('set_date:', datetime.date(year=2021, month=8, day=20))
# set_date: 2021-08-20
print('set_date:', datetime.date(2021, 8, 20))
# set_date: 2021-08-20
KST = datetime.timezone(datetime.timedelta(hours=9))
print('timezone_KST:', datetime.timezone(datetime.timedelta(hours=9)))
# timezone_KST: UTC+09:00
print(datetime.datetime(2021, 8, 20, 8, 20, 45, tzinfo=KST))
# 2021-08-20 08:20:45+09:00
print(datetime.datetime.now(KST))
# 2021-08-25 08:23:35.759768+09:00
print('now_UTC:', datetime.datetime.now(pytz.timezone('UTC')))
# now_UTC: 2021-08-24 23:23:35.428072+00:00
print('now_Asia/Seoul:', datetime.datetime.now(pytz.timezone('Asia/Seoul')))
# now_Asia/Seoul: 2021-08-25 08:23:35.759768+09:00
print(datetime.datetime.now().astimezone(pytz.timezone('Asia/Seoul')))
# 2021-08-25 08:52:20.851008+09:00
now = datetime.datetime.now(pytz.timezone('Asia/Seoul'))
now_datetime = now.strftime('%Y-%m-%d %H:%M:%S')
print(now_datetime)
# 2021-08-25 09:10:58
▶ 장고 models의 DateTimeField() 한국시간 입력
장고의 models.py에서 모델 클래스 작성 시,
models.DateTimeField(auto_now=True)로 설정하면서 한국 시간으로 입력되게 하려면
장고 setting.py에서 TIME_ZONE은 'Asia/Seoul', USE_TZ는 False 또는 비활성화 시킨다.
TIME_ZONE = 'Asia/Seoul'
USE_I18N = True
USE_L10N = True
USE_TZ = False #USE_TZ = True
각 요소 의미,
TIME_ZONE 'Asia/Seoul' → 테이터베이스 시간대 설정 문자열
USE_I18N = True → 장고 번역 시스템 활성화 여부
USE_L10N = True → 현지화 데이터 형식 사용 여부
USE_TZ = True → 시간대 인식 여부 설정
▶ 장고(django)의 한국시간 입력 테스트
장고에서 다음과 같은 settings.py 환경을 설정한 상태로 sqlite3 db insert 시간을 한국시간으로 하기 위한 방법을 구글에서 찾아보고 테스트를 해봤다.
TIME_ZONE = 'Asia/Seoul' # 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
파이썬에서는 datetime을 사용해도 되지만, 장고에서는 timezone.now() 사용을 권장한다.
timezone.now() 사용 시 관련 모듈은
from django.utils import timezone
datetime 과의 비교를 위해 datetime 사용 모듈을 아래처럼 import 하고,
import datetime
import pytz
각 시간 확인을 위해 다음과 같이 코딩을 하고 확인했다.
print(f'timezone.now(): {timezone.now()}')
timezone_now = timezone.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'timezone_now: {timezone_now}')
date_time = datetime.datetime.now(pytz.timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')
print(f'date_time: {date_time}')
today_now = timezone.localtime()
print(f'today_now: {today_now}')
결과는,
timezone.now(): 2021-09-15 04:19:49.836246+00:00
timezone_now: 2021-09-15 04:19:49
date_time: 2021-09-15 13:19:49
today_now: 2021-09-15 13:19:49.697634+09:00
위에서 문제는,
USE_TZ = True 로 사용하면 localtime이 나라별로 적용되긴 한다지만 한국에서만 운영할 사이트라면, 생각을 한 번 해봐야 할 문제이고,
timezone.now()를 사용할 경우 tz_info 부분을 고려해야 한다는 점(db와 장고 템플릿에서 보이는 시간이 상이한 경우가 발생하여 변환을 해야 한다는 것)이 있다.
이에 반해, settings.py에서 USE_TZ = False 로 수정하고 실행한 결과는
(단, timezone.localtime() 은 에러 발생으로 제외시킴)
timezone.now(): 2021-09-15 14:10:24.351954
timezone_now: 2021-09-15 14:10:24
date_time: 2021-09-15 14:10:24
결론적으로,
한국에서만 운영할 사이트이고 sqlite3에 날짜와 시간을 헷갈리지 않게 하기 위해서는
USE_TZ = False 설정하고,
timezone.now()를 사용해 Y-m-d H:M:S 형식으로 db 입력되고 템플릿에서도 동일하게 보이도록 하는 것이 좋을 듯하다.
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
네이버 검색어 중 자동완성어 추출해보기(with 파이썬) (0) | 2021.10.15 |
---|---|
[python] 장고(django)로 게시판 만들어보기 (1) | 2021.10.11 |
구글에서 원하는 이미지 다운로드 해보기 (with 파이썬) (0) | 2021.10.11 |
VS Code에서 파이썬 가상환경 만들기 (1) | 2021.10.11 |
파이썬 장고(django) 웹 프로그래밍 - 웹 페이지 만들기 # 1 (0) | 2021.09.23 |
댓글