2015-01-15 2 views
1

나는이 정확한 issue을 발견했으며, 내 경우에는 해결책을 얻는 방법을 알 수 없다.Python에서 UTC로 변환 한 후 tzinfo를 완전히 제거하는 방법은 무엇입니까?

귀도이 내가 시도 무엇

The solution is to remove the tzinfo completely from the time after converting to UTC.

말한다 :

 date_time = parser.parse(i.pubDate.text) 
     news.publication_date = date_time.replace(tzinfo=None).date() 

그리고 같은 오류 얻을 :

NotImplementedError: DatetimeProperty publication_date_time can only support UTC. Please derive a new Property to support alternative timezones. 

그래서 내가 날짜를 변환 할 것을 먼저 UTC로. 그리고 여기 내 연구가 실패했습니다.

나는이 solution 건너 온 :

제안 해결책은 이것이다 :

def date_time_to_utc(date_time): 
     tz = pytz.timezone('???') 
     return tz.normalize(tz.localize(date_time)).astimezone(pytz.utc) 

하지만 시간대가 없습니다. html 소스에서 날짜를 고칩니다. 따라서 시간대는 실제로 세계 어디에서나있을 수 있습니다. 날짜 시간을 UTC로 변환하는 쉽고 안정적인 방법이 있습니까? 이것을 달성하기 위해 dateutilpytz을 모두 사용할 수 있습니다. 많은 감사.

업데이트 정말 긴 하루였습니다. 스택 추적을 잘못 읽었습니다. 그러나 질문은 유효합니다.

date_time = (datetime}2015-01-13 18:13:26+00:00 
news.publication_date_time = date_time 

이로 인해 충돌이 발생했습니다. 그리고 이렇게하면 유닛 테스트를 통과합니다 :

GMT 0 datetime을 UTC datetime으로 변환하는 올바른 방법입니까? 또는 실제로 UTC에 대한 모든 시간대?

+0

게시 한 코드 ("이것은 내가 시도한 것입니다 :")는 '순진한'날짜 시간을 날짜로 바꾸는 것을 보여 주지만 오류는 DatetimeProperty에서 발생합니다. 트레이스가 당신이 보여준 코드로 확실히 인도합니까? 그것은 정확 해 보입니다 ... – Greg

+0

@Houman :'.date()'앞에'.replace (tzinfo = None)'이 필요 없습니다. 항상 순진한'date' 객체를 반환합니다. – jfs

답변

1

Is this the correct way converting a GMT 0 datetime to UTC datetime? Or in fact any timezone to UTC?

경우 수식은 작동합니다 :

naive_utc = aware_utc.replace(tzinfo=None) 

여기서 aware_utc은 UTC로 시간을 나타내는 시간대 인식 datetime 객체입니다.

그러나 aware datetime 개체가 UTC가 아닌 경우; 실패합니다. 당신은 계정에 일반적인 경우에 오프셋 (아마도) 비제 UTC를 취해야한다 : aware는 임의의 시간대에서 시간대를 인식하는 날짜 개체입니다

assert aware.tzinfo is not None and aware.utcoffset() is not None 
# local time = utc time + utc offset (by definition) 
# -> utc = local - offset 
naive_utc = aware.replace(tzinfo=None) - aware.utcoffset() 

.날짜 문자열 자체가 시간대를 포함 (또는 적어도 그 UTC 오프셋)하지 않는 한


But I don't have the timezone. I am scraping the date from a html source. So the timezone could really be from anywhere in the world. Is there no easy and reliable way to convert a date time to UTC? I could use both dateutil and pytz to achieve this. Many Thanks.

번호 dateutil, pytz은 도움이되지 않습니다.

는 기억이 항상 정오 지구 즉, 당신이 날짜를 수집하는 경우 해당 시간대를 첨부하지 않는 한/지구에 다른 장소에서 시간 문자열은 다음을 비교할 수 없습니다. UTC로 변환 할 수 없으므로 날짜의 소스 시간대를 모르는 경우 올바른 POSIX 타임 스탬프를 얻을 수 없습니다.

+0

'aware_utc '의 의미를 설명해 주시겠습니까? GMT +1은'aware_utc'입니까? – Houman

+0

@Houman : 예. 아니. 'aware_utc' * 항상 *는 ** 제로 ** utc 오프셋을가집니다. GMT + 1은 1 시간 utc 오프셋을 의미합니다. 즉, 'GMT + 1'은 'aware_utc'가 아닙니다. 제가 제공 한 수식을 사용하십시오. 그것은 항상 작동합니다. – jfs

+0

설명에 대해 많은 감사드립니다. 따라서 내 datetime이 항상 GMT로 표시된다면 다음과 같이 변환하는 것이 더 안전합니다 :'naive_utc = aware.replace (tzinfo = None) - aware.utcoffset()'. 나는 겨울에 겨울에 살고 있음을주의한다. 우리 UTC/GMT 오프셋은 0이므로 동일하다. 그러므로 위의'date_time = (datetime) 2015-01-13 18 : 13 : 26 + 00 : 00'에 제공된 날짜는 GMT +0이어야하며, UTC가 아닙니다. (필자가 혼합하지 않는 한 표시되는 형식은 다음과 같습니다. 실제로 UTC와 GMT는 다르게 쓰여집니다) :) – Houman

0

나는 바보예요. 여기 늦었습니다. 이번에는 질문을 읽었습니다.

tstmp= date_time.replace(tzinfo=utc).total_seconds() 
naive_date = datetime.utcfromtimestamp(tstmp) 

첫 번째 대답은 당신에게 현재 순진 시간을 줄 것이다

0

이 시도 : aware 날짜 개체가 UTC (+0000)를 이미

dateTime = dateTime.replace(tzinfo=None) 
dtUtcAware = pytz.UTC.localize(dateTime) 
관련 문제