source

오프셋 네이티브 및 오프셋 인식 데이터 시간을 뺄 수 없습니다.

nicesource 2022. 11. 14. 21:35
반응형

오프셋 네이티브 및 오프셋 인식 데이터 시간을 뺄 수 없습니다.

타임존을 인식하고 있습니다.timestamptzPostgre 필드SQL. 테이블에서 데이터를 꺼낼 때 지금 시간을 빼서 오래된 데이터를 얻으려고 합니다.

내가 안고 있는 문제는 둘 다datetime.datetime.now()그리고.datetime.datetime.utcnow()는 타임존을 인식하지 못한 타임스탬프를 반환하는 것 같습니다.그 결과, 다음의 에러가 표시됩니다.

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

이것을 회피하는 방법이 있습니까(가능한 한 서드파티 모듈을 사용하지 않는 것이 좋습니다).

EDIT: 제안해 주셔서 감사합니다만, 시간대를 조정하려고 하면 오류가 발생하는 것 같습니다.따라서 PG에 타임존을 인식하지 않는 타임스탬프를 사용하고 항상 다음을 사용하여 삽입합니다.

NOW() AT TIME ZONE 'UTC'

이렇게 하면 타임스탬프는 기본적으로 UTC가 됩니다(이렇게 하는 것이 더 귀찮지만).

시간대 인식을 없애보셨나요?

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

naive = dt.replace(tzinfo=None)

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

edit: 이 답변의 연령에 유의하십시오.다음은 python 3에서 시간대 정보를 삭제하는 대신 추가하는 것에 관한 답변입니다.https://stackoverflow.com/a/25662061/93380

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

from datetime import datetime, timezone

now = datetime.now(timezone.utc)

오래된 Python 버전에서는utctzinfo 객체 사용자 지정(datetime docs에서 선택):

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()

기본 Django 설정 인프라스트럭처를 설정해야 합니다.이러한 유형의 인터페이스를 사용하고 있는 경우라도(설정에서는 다음을 포함할 필요가 있습니다).USE_TZ=True인식 일시를 취득합니다).

그 자체로는 아마도 Django를 인터페이스로 사용하도록 동기부여하기에는 턱없이 부족하지만, 다른 많은 혜택들이 있다.한편, 만약 당신이 (나처럼) 당신의 장고 앱을 엉망으로 만들었기 때문에 여기서 비틀거렸다면, 아마도 이것이 도움이 될 것이다.

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

# 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

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

성병 이외에는 아무것도 필요없어

datetime.datetime.now().astimezone()

시간대만 바꾸면 시간이 조정되지 않습니다.시스템이 이미 UTC인 경우 .replace(tz='UTC')로 충분합니다.

>>> x=datetime.datetime.now()
datetime.datetime(2020, 11, 16, 7, 57, 5, 364576)

>>> print(x)
2020-11-16 07:57:05.364576

>>> print(x.astimezone()) 
2020-11-16 07:57:05.364576-07:00

>>> print(x.replace(tzinfo=datetime.timezone.utc)) # wrong
2020-11-16 07:57:05.364576+00:00

나도 같은 문제에 직면했다.그리고 나서 나는 많은 검색 끝에 해결책을 찾았다.

문제는 모델 또는 형식에서 datetime 객체를 얻었을 때 오프셋 인식되고 시스템별로 시간을 얻었을 경우 오프셋이 단순하다는 것입니다.

그래서 timezone.now()사용하여 현재 시간을 취득하고 django.simport 타임존에서 타임존을 Import하여 USE_TZ = True를 프로젝트 설정 파일에 넣습니다.

psycopg2 모듈에는 독자적인 타임존 정의가 있기 때문에 UTCNOW에 대한 독자적인 래퍼를 작성하게 되었습니다.

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

쓰면 돼요.pg_utcnowPostgrePostgre마다 SQL SQL사용합니다.timestamptz

매우 심플한 솔루션을 생각해 냈습니다.

import datetime

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

타임존 인식과 타임존 네이티브의 양쪽의 datetime 값으로 동작합니다.또, 라이브러리나 데이타베이스의 회피책은 없습니다.

제목에 있는 질문에 대한 가장 간단한 답변이 누락된 것 같습니다.

naive_date.replace(tzinfo=aware_date.tzinfo) - aware_date

timezone.make_aware(datetime.datetime.now())(1.9.1) 아쉽게도 는 없어요.datetime한 후, 「」, 「」를 참조해 주세요.timetz() 이거 요. 츠요시datetime그것을 바탕으로 비교를 합니다.

Postgre에서 나이 계산을 할 수 없는 긴급한 이유가 있나요?SQL 자체?뭐랄까

select *, age(timeStampField) as timeStampAge from myTable

오래된 건 알지만 혹시나 도움이 될 것 같아서 제 솔루션을 추가하려고요.

로컬 Naigive datetime을 타임서버에서 인식된 datetime과 비교하려고 합니다.기본적으로 인식된 datetime 개체를 사용하여 새로운 naigent datetime 개체를 만들었습니다.좀 엉성하고 보기엔 별로지만 일을 해냅니다.

import ntplib
import datetime
from datetime import timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)    

try:
    ntpt = ntplib.NTPClient()
    response = ntpt.request('pool.ntp.org')
    date = utc_to_local(datetime.datetime.utcfromtimestamp(response.tx_time))
    sysdate = datetime.datetime.now()

가짜가 나타났어

    temp_date = datetime.datetime(int(str(date)[:4]),int(str(date)[5:7]),int(str(date)[8:10]),int(str(date)[11:13]),int(str(date)[14:16]),int(str(date)[17:19]))
    dt_delta = temp_date-sysdate
except Exception:
    print('Something went wrong :-(')

언급URL : https://stackoverflow.com/questions/796008/cant-subtract-offset-naive-and-offset-aware-datetimes

반응형