복붙노트

[PYTHON] 파이썬 : 로컬 타임 존을 찾아냅니다.

PYTHON

파이썬 : 로컬 타임 존을 찾아냅니다.

로컬 타임 스탬프와 로그 파일의 UTC 타임 스탬프를 비교하고 싶습니다. 로컬 datetime 객체를 만들 때 다음과 같은 것을 사용합니다.

>>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0, 
                                 tzinfo=pytz.timezone('Israel'))

나는 thetzinfo = pytz.timezone ( 'Israel')을 현재 지역 시간대로 대체 할 수있는 자동 도구를 찾고 싶습니다.

어떤 아이디어?

해결법

  1. ==============================

    1.필요한 것을 수행하는 tzlocal 유형의 dateutil을 시도하십시오.

    필요한 것을 수행하는 tzlocal 유형의 dateutil을 시도하십시오.

  2. ==============================

    2.파이썬 3.x에서 지역 시간대는 다음과 같이 계산할 수 있습니다 :

    파이썬 3.x에서 지역 시간대는 다음과 같이 계산할 수 있습니다 :

    import datetime
    LOCAL_TIMEZONE = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
    

    datetime 코드를 사용하는 것은 까다 롭습니다.

  3. ==============================

    3.휴대용 방식으로 현지 시간대에 대한 Olson TZ 이름을 찾는 것은 어렵습니다. 다행히도 비교를 수행 할 필요가 없습니다.

    휴대용 방식으로 현지 시간대에 대한 Olson TZ 이름을 찾는 것은 어렵습니다. 다행히도 비교를 수행 할 필요가 없습니다.

    tzlocal 모듈은 로컬 시간대에 해당하는 pytz 시간대를 반환합니다.

    from datetime import datetime
    
    import pytz # $ pip install pytz
    from tzlocal import get_localzone # $ pip install tzlocal
    
    tz = get_localzone()
    local_dt = tz.localize(datetime(2010, 4, 27, 12, 0, 0, 0), is_dst=None)
    utc_dt = local_dt.astimezone(pytz.utc) #NOTE: utc.normalize() is unnecessary here
    

    지금까지 제시된 다른 솔루션과 달리 위의 코드는 다음과 같은 문제점을 피합니다.

    참고 : 순진한 datetime 객체의 시간대 인식 datetime 객체를 얻으려면 * :를 사용해야합니다.

    local_dt = tz.localize(datetime(2010, 4, 27, 12, 0, 0, 0), is_dst=None)
    

    대신에:

    #XXX fails for some timezones
    local_dt = datetime(2010, 4, 27, 12, 0, 0, 0, tzinfo=tz)
    

    * is_dst = None은 주어진 현지 시간이 모호하거나 존재하지 않으면 예외를 강제 실행합니다.

    모든 로컬 타임 스탬프가 로컬 시간대에 대해 동일한 (현재) utc 오프셋을 사용한다는 것이 확실한 경우 stdlib 만 사용하여 비교를 수행 할 수 있습니다.

    # convert a naive datetime object that represents time in local timezone to epoch time
    timestamp1 = (datetime(2010, 4, 27, 12, 0, 0, 0) - datetime.fromtimestamp(0)).total_seconds()
    
    # convert a naive datetime object that represents time in UTC to epoch time
    timestamp2 = (datetime(2010, 4, 27, 9, 0) - datetime.utcfromtimestamp(0)).total_seconds()
    

    timestamp1과 timestamp2는 직접 비교할 수 있습니다.

    노트 :

  4. ==============================

    4.나는 나에게도 똑같은 질문을하고 있었고 나는 그 대답을 1 :

    나는 나에게도 똑같은 질문을하고 있었고 나는 그 대답을 1 :

    8.1.7 절을보십시오 : "% z"형식 (소문자, Z 대문자는 표준 시간대를 반환하지만 4 자리 형식이 아니라 [3]과 같은 시간대 약어의 형태로 나타납니다) strftime은 전자 메일 헤더에 표준 인 "+/- 4DIGIT"형식을 반환합니다 (RFC 2822의 3.3 절, [2] 참조, 전자 메일 헤더에 대한 표준 시간대 지정의 다른 방법을 참조하십시오).

    시간대를이 형식으로 지정하려면 다음을 사용하십시오.

    time.strftime("%z")
    

    [1] http://docs.python.org/2/library/datetime.html

    [2] http://tools.ietf.org/html/rfc2822#section-3.3

    [3] 시간대 약어 : http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations, 참고 용입니다.

  5. ==============================

    5.먼저 pytz 모듈과 tzlocal 모듈을 얻습니다.

    먼저 pytz 모듈과 tzlocal 모듈을 얻습니다.

    pytz tzlocal을 설치하십시오.

    그때

    from tzlocal import get_localzone
    local = get_localzone()
    

    다음과 같은 일을 할 수 있습니다.

    from datetime import datetime
    print(datetime.now(local))
    
  6. ==============================

    6.다음은 표준 라이브러리 만 사용하여 현지 시간대를 가져 오는 방법입니다 (* nix 환경에서만 작동 함).

    다음은 표준 라이브러리 만 사용하여 현지 시간대를 가져 오는 방법입니다 (* nix 환경에서만 작동 함).

    >>> '/'.join(os.path.realpath('/etc/localtime').split('/')[-2:])
    'Australia/Sydney'
    

    이것을 사용하여 pytz 시간대를 만들 수 있습니다 :

    >>> import pytz
    >>> my_tz_name = '/'.join(os.path.realpath('/etc/localtime').split('/')[-2:])
    >>> my_tz = pytz.timezone(my_tz_name)
    >>> my_tz
    <DstTzInfo 'Australia/Sydney' LMT+10:05:00 STD>
    

    ... 다음 datetime에 적용 할 수 있습니다.

    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> now
    datetime.datetime(2014, 9, 3, 9, 23, 24, 139059)
    
    >>> now.replace(tzinfo=my_tz)
    >>> now
    datetime.datetime(2014, 9, 3, 9, 23, 24, 139059, tzinfo=<DstTzInfo 'Australia/Sydney' LMT+10:05:00 STD>)
    
  7. ==============================

    7.J. F. Sebastian의 답을 바탕으로 표준 라이브러리로 이것을 할 수 있습니다 :

    J. F. Sebastian의 답을 바탕으로 표준 라이브러리로 이것을 할 수 있습니다 :

    import time, datetime
    local_timezone = datetime.timezone(datetime.timedelta(seconds=-time.timezone))
    

    3.4에서 테스트되었습니다. 3.4 이상에서 작동해야합니다.

  8. ==============================

    8.@ vbem의 솔루션을 좀 더 간결하게 정리 한 버전이 있습니다.

    @ vbem의 솔루션을 좀 더 간결하게 정리 한 버전이 있습니다.

    from datetime import datetime as dt
    
    dt.utcnow().astimezone().tzinfo
    

    유일하게 중요한 차이점은 datetime.datetime.now (datetime.timezone.utc)를 datetime.datetime.utcnow ()로 바꿨다는 것입니다. 간결함을 위해 datetime.datetime을 dt로 변경했습니다.

    내 목적을 위해 초 단위로 UTC 오프셋을 원합니다. 다음은 그 모습입니다.

    dt.utcnow().astimezone().utcoffset().total_seconds()
    
  9. ==============================

    9.비표준 모듈 피하기 (datetime 모듈의 누락 된 메소드 인 것 같습니다) :

    비표준 모듈 피하기 (datetime 모듈의 누락 된 메소드 인 것 같습니다) :

    from datetime import datetime
    utcOffset_min = int(round((datetime.now() - datetime.utcnow()).total_seconds())) / 60   # round for taking time twice
    utcOffset_h = utcOffset_min / 60
    assert(utcOffset_min == utcOffset_h * 60)   # we do not handle 1/2 h timezone offsets
    
    print 'Local time offset is %i h to UTC.' % (utcOffset_h)
    
  10. ==============================

    10.위의 Thoku의 답을 바탕으로 시간대를 가장 가까운 30 분 (예 : 남호주의 시간대와 관련이 있음)으로 결정하는 대답은 다음과 같습니다.

    위의 Thoku의 답을 바탕으로 시간대를 가장 가까운 30 분 (예 : 남호주의 시간대와 관련이 있음)으로 결정하는 대답은 다음과 같습니다.

    from datetime import datetime
    round((round((datetime.now()-datetime.utcnow()).total_seconds())/1800)/2)
    
  11. ==============================

    11.단순한 일을 위해서 OS에 시간대 오프셋을 쿼리하는 다음과 같은 tzinfo 구현을 사용할 수 있습니다.

    단순한 일을 위해서 OS에 시간대 오프셋을 쿼리하는 다음과 같은 tzinfo 구현을 사용할 수 있습니다.

    import datetime
    import time
    
    class LocalTZ(datetime.tzinfo):
        _unixEpochOrdinal = datetime.datetime.utcfromtimestamp(0).toordinal()
    
        def dst(self, dt):
            return datetime.timedelta(0)
    
        def utcoffset(self, dt):
            t = (dt.toordinal() - self._unixEpochOrdinal)*86400 + dt.hour*3600 + dt.minute*60 + dt.second + time.timezone
            utc = datetime.datetime(*time.gmtime(t)[:6])
            local = datetime.datetime(*time.localtime(t)[:6])
            return local - utc
    
    
    print datetime.datetime.now(LocalTZ())
    print datetime.datetime(2010, 4, 27, 12, 0, 0, tzinfo=LocalTZ())
    
    # If you're in the EU, the following datetimes are right on the DST change.
    print datetime.datetime(2013, 3, 31, 0, 59, 59, tzinfo=LocalTZ())
    print datetime.datetime(2013, 3, 31, 1, 0, 0, tzinfo=LocalTZ())
    print datetime.datetime(2013, 3, 31, 1, 59, 59, tzinfo=LocalTZ())
    
    # The following datetime is invalid, as the clock moves directly from
    # 01:59:59 standard time to 03:00:00 daylight savings time.
    print datetime.datetime(2013, 3, 31, 2, 0, 0, tzinfo=LocalTZ())
    
    print datetime.datetime(2013, 10, 27, 0, 59, 59, tzinfo=LocalTZ())
    print datetime.datetime(2013, 10, 27, 1, 0, 0, tzinfo=LocalTZ())
    print datetime.datetime(2013, 10, 27, 1, 59, 59, tzinfo=LocalTZ())
    
    # The following datetime is ambigous, as 02:00 can be either DST or standard
    # time. (It is interpreted as standard time.)
    print datetime.datetime(2013, 10, 27, 2, 0, 0, tzinfo=LocalTZ())
    
  12. ==============================

    12.먼저,이 질문은 알고있는 datetime 개체의 잘못된 초기화를 나타냅니다.

    먼저,이 질문은 알고있는 datetime 개체의 잘못된 초기화를 나타냅니다.

    >>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0,
    ...                                  tzinfo=pytz.timezone('Israel'))
    

    잘못된 인스턴스를 만듭니다. 결과 객체의 UTC 오프셋을 계산하여 문제를 볼 수 있습니다.

    >>> print(local_time.utcoffset())
    2:21:00
    

    (결과는 1 시간의 홀수 부분입니다.)

    pytz를 사용하여 적절한 datetime을 올바르게 초기화하려면 다음과 같이 localize () 메서드를 사용해야합니다.

    >>> local_time=pytz.timezone('Israel').localize(datetime.datetime(2010, 4, 27, 12))
    >>> print(local_time.utcoffset())
    3:00:00
    

    이제 새로운 tzinfo로 로컬 pytz 시간대가 필요한 경우, 다른 사람들이 설명한대로 tzlocal 패키지를 사용해야합니다. 그러나 필요한 경우 올바른 현지 시간대 오프셋과 약어가있는 인스턴스가 필요하고 파이썬 3.3으로 tarting 할 수 있습니다. 인식 할 수있는 datetime 인스턴스를 현지 시간대로 변환하려면 인수없이 astimezone () 메소드를 호출하십시오.

    >>> local_time.astimezone().strftime('%Y-%m-%d %H:%M %Z %z')
    '2010-04-27 05:00 EDT -0400'
    
  13. ==============================

    13.dateutil에서 tzlocal.

    dateutil에서 tzlocal.

    코드 예는 다음과 같습니다. 파일 이름에 사용하기에 적합한 마지막 문자열.

    >>> from datetime import datetime
    >>> from dateutil.tz import tzlocal
    >>> str(datetime.now(tzlocal()))
    '2015-04-01 11:19:47.980883-07:00'
    >>> str(datetime.now(tzlocal())).replace(' ','-').replace(':','').replace('.','-')
    '2015-04-01-111947-981879-0700'
    >>> 
    
  14. from https://stackoverflow.com/questions/2720319/python-figure-out-local-timezone by cc-by-sa and MIT license