질문은 다름이 아니라 시간에 관한 문제입니다.
파이썬에서 제공하는 시간관련 함수를 사용하여 시간을 얻어왔는데, localtime으로 받아와도 이상하게 현재 시간이 안나오고
좀 다른 시간이 나오네요.
클라이언트에서 시간을 넘겨주면 시간의 조작이 가능해져서, 서버시간을 사용해야할 것 같은데, 시간을 제대로 구할 수는 없을까요?
레퍼런스를 찾아봤는데, 제가 못찾는 건지 안보입니다. ㅜㅜ
혹시 아직 배포안하고, 개발 서버에서 받아와서 그런걸까요? -_-;
설명을 쓰다보니 단어가 꽤 헷갈리는군요. 시각이라는 것은 크게 두 가지로 나눌 수 있겠습니다.
a. Client Time: 현재 내 컴퓨터의 시각
b. Server Time: 현재 서버의 시각
- python만으로 Client Time을 출력하긴 좀 어려울 것 같고요. (자바스크립트로는 가능하지요? :] )
- 내 컴퓨터에서 개발 서버가 돌아갈 경우 Client Time과 Server Time이 동일합니다. (당연하지요.
dev_appserver.py가 따로 구글 서버에서 시간을 가져오지 않는 이상...) 이는 앱엔진의 특성이 아니라 일반적으로
그냥 파이선 스크립트를 돌려보셔도 아마 같을 겁니다.
- 따라서 구글의 appengine 서버에 업로드 후에는 Client Time은 아무런 상관이 없고, 해당 Server의
Server Time을 리턴하게 됩니다. 단, 이 때 해당 서버가 TimeZone이 어디로 설정되어 있느냐에 따라 Server
Time자체도 UTC(표준시)와 다른 값을 보여줄(!) 수 있습니다.
0. datetime.now([tz])나 datetime.today()를 수행하신 거죠? today()를 쓰시면 서버에 설정된
타임존을 기반으로 서버시각을 산출하여 돌려줍니다. now 는 특정 TimeZone이 현재 몇 시인지 알아볼 수 있는
함수입니다. time.localtime() 보다는 더 정확한 시간을 얻을 수 있는 datetime.now()를 더
추천드립니다.
1. 로컬에서 위의 두 함수 중 하나를 수행하시면 당연히 로컬 시간을 서버시각으로 생각하고, 로컬 컴퓨터의 시각이 나옵니다.
2. 그런데, 구글 서버에 업로드해서 해 보시면 현재 한국의 시각과 다른 시각이 나옵니다. 이는 구글 서버가 다른 타임존으로
설정되었기 때문이지요. 이럴 경우 아래와 같이 타임존 클래스를 만듦으로써 해결 가능합니다.
from datetime import timedelta, datetime, tzinfo
class KST(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=9)
def dst(self, dt):
return timedelta(0)
def tzname(self,dt):
return "(UTC+09:00)"
kst = KST()
now1 = datetime.now(kst)
now2 = datetime.now()
print "Content-type: text/plain;\n\n"
print now1
print now2
위 스크립트를 로컬과 서버에서 수행해 보시면 그 차이를 간단히 이해하실 수 있을 것이고요.
업로드한 결과는 http://qrnamecard.appspot.com/timetest 에서 간단히 보실 수 있습니다.
제 실행 결과는 이렇군요.
[local]
2010-11-01 22:49:06.550000+09:00
2010-11-01 22:49:06.550000
[server]
2010-11-01 22:50:09.104235+09:00
2010-11-01 13:50:09.104292
3. 한번에 여러 타임존을 지원하시고 싶으실 때에는 pytz라는 패키지를 사용하시거나
timezonetimezone.appspot.com 을 이용하시면 됩니다. 사이트가 사용이 빈번하여 쿼터 오버가 걱정되시면
http://appengine-cookbook.appspot.com/recipe/caching-pytz-helper/ 를
참고하시면 됩니다.
감사합니다.
2010/11/1 rehomik <re.h...@gmail.com>
> --
> Google 그룹스 '구글 앱 엔진 개발자 토론 그룹' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 이 그룹에 게시하려면 google-app-...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 google-app-engine...@googlegroups.com로 이메일을 보내주세요.
> 더 많은 옵션을 보려면 http://groups.google.com/group/google-app-engine-korea?hl=ko에서 그룹을 방문하세요.
>
--
궁금한 것이 싹 해결되었네요!! ㅜㅜ
2010년 11월 1일 오후 11:13, Junghwan Park <ffe...@gmail.com>님의 말:
--
Jae bum Kim
blog: rehomik.tistory.com
E-mail: re.h...@gmail.com
nate-on: muj...@nate.com
twitter: @rehomik
한가지 또 궁금증이 생겼네요 근데;;;
이게 희한한게, 로컬의 시간은 자동으로 맞춰주는 걸로 셋팅되어있어서 현재 시간으로 맞추어져 있는데,
time.localtime()을 사용하든, datetime.now()를 사용하든, 시간이 이상하게 나옵니다.
9시 42분에 찍어보았더니,
datetime.datetime(2010, 11, 2, 0, 43, 3, 941452)
라고 나오네요 -_-; 게다가 최초 출력시에는 11월 1일로 나옵니다.-_-;
답변해주신 tzinfo를 상속받은 클래스를 사용하면 정상적으로 나오는데 무슨 이유일까 궁금해져서 다시 한번 글 올려봅니다.
2010년 11월 2일 오전 12:47, 김재범 <re.h...@gmail.com>님의 말:
나의 iPhone4에서 보냄
2010. 11. 2. 오전 9:46 김재범 <re.h...@gmail.com> 작성:
로컬 시간이 나온다고 하셨는데 0이 나와서요 ^^;
2010년 11월 3일 오전 9:48, Junghwan Park <ffe...@gmail.com>님의 말: