본문 바로가기
코딩 연습/코딩배우기

파이썬 datetime 모듈과 장고(django) 시간대(use tz) 설정

by good4me 2021. 10. 11.

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

 

good4me.co.kr

 

▶ 장고 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 입력되고 템플릿에서도 동일하게 보이도록 하는 것이 좋을 듯하다.

 

댓글