[python] 오프셋 순진 및 오프셋 인식 날짜 시간을 뺄 수 없습니다

timestamptzPostgreSQL에 시간대 인식 필드가 있습니다. 테이블에서 데이터를 가져 오면 지금 시간을 빼서 나이를 얻을 수 있습니다.

제가하는 데 문제는 모두이다 datetime.datetime.now()그리고 datetime.datetime.utcnow()나 결과이 오류가 발생 시간대 인식 타임 스탬프를 반환하는 것 :

TypeError: can't subtract offset-naive and offset-aware datetimes 

이것을 피할 수있는 방법이 있습니까 (타사 모듈을 사용하지 않는 것이 좋습니다).

편집 : 제안에 감사하지만 시간대를 조정하려고하면 오류가 발생하는 것 같습니다. 따라서 PG에서 시간대를 인식하지 못하는 시간대를 사용하고 항상 다음을 사용하여 삽입합니다.

NOW() AT TIME ZONE 'UTC'

그렇게하면 모든 타임 스탬프가 기본적으로 UTC입니다 (더 짜증나더라도).



답변

시간대 인식을 제거하려고 했습니까?

에서 http://pytz.sourceforge.net/

naive = dt.replace(tzinfo=None)

시간대 변환을 추가해야 할 수도 있습니다.

편집 :이 답변의 나이를 알고하십시오. Python 3 답변은 다음과 같습니다.


답변

올바른 해결책은 시간대 정보 를 추가 하는 것입니다. 예를 들어 Python 3에서 현재 시간을 인식 가능한 datetime 객체로 가져옵니다.

from datetime import datetime, timezone

now = datetime.now(timezone.utc)

이전 Python 버전에서는 utctzinfo 객체를 직접 정의 할 수 있습니다 (datetime 문서의 예).

from datetime import tzinfo, timedelta, datetime

ZERO = timedelta(0)

class UTC(tzinfo):
  def utcoffset(self, dt):
    return ZERO
  def tzname(self, dt):
    return "UTC"
  def dst(self, dt):
    return ZERO

utc = UTC()

그때:

now = datetime.now(utc)


답변

일부 사람들은 이러한 유형의 데이터베이스 상호 작용을 추상화하기 위해 Django를 인터페이스로 사용합니다. Django는이를 위해 사용할 수있는 유틸리티를 제공합니다 :

from django.utils import timezone
now_aware = timezone.now()

이 유형의 인터페이스 만 사용하더라도 기본 장고 설정 인프라를 설정해야합니다 (설정에서 USE_TZ=True날짜 시간을 알기 위해 포함해야 함 ).

그 자체로는 아마도 장고를 인터페이스로 사용하도록 동기를 부여 할 정도로 가까운 곳은 아니지만 다른 많은 특전이 있습니다. 반면에, 내가했던 것처럼 장고 앱을 조작했기 때문에 여기에서 넘어 졌다면 아마도 도움이 될 것입니다 …


답변

이것은 매우 간단하고 명확한 솔루션입니다.
두 줄의 코드

# First we obtain de timezone info o some datatime variable    

tz_info = your_timezone_aware_variable.tzinfo

# Now we can subtract two variables using the same time zone info
# For instance
# Lets obtain the Now() datetime but for the tz_info we got before

diff = datetime.datetime.now(tz_info)-your_timezone_aware_variable

결론 : 동일한 시간 정보로 날짜 시간 변수를 관리해야합니다 .


답변

psycopg2 모듈에는 자체 시간대 정의가 있으므로 utcnow 주위에 자체 래퍼를 작성했습니다.

def pg_utcnow():
    import psycopg2
    return datetime.utcnow().replace(
        tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None))

pg_utcnowPostgreSQL과 비교하기 위해 현재 시간이 필요할 때마다 사용하십시오.timestamptz


답변

나는 또한 같은 문제에 직면했다. 그런 다음 많은 검색 후 해결책을 찾았습니다.

문제는 모델이나 양식에서 datetime 객체를 가져올 때 오프셋을 인식 하고 시스템별로 시간을 가져 오면 순진 하다는 것입니다 .

그래서 내가 한 것은 timezone.now () 사용하여 현재 시간 을 얻었고 django.utils import timezone에서 시간대를 가져 와서 프로젝트 설정 파일에 USE_TZ = True 를 넣는 것 입니다.


답변

나는 매우 간단한 해결책을 생각해 냈습니다.

import datetime

def calcEpochSec(dt):
    epochZero = datetime.datetime(1970,1,1,tzinfo = dt.tzinfo)
    return (dt - epochZero).total_seconds()

표준 시간대 인식 및 표준 시간대 미정 날짜 시간 값과 함께 작동합니다. 추가 라이브러리 나 데이터베이스 해결 방법이 필요하지 않습니다.