복붙노트

[PYTHON] Python datetime strptime () 및 strftime () : 표준 시간대 정보 보존 방법

PYTHON

Python datetime strptime () 및 strftime () : 표준 시간대 정보 보존 방법

다음 코드를 참조하십시오.

import datetime
import pytz

fmt = '%Y-%m-%d %H:%M:%S %Z'

d = datetime.datetime.now(pytz.timezone("America/New_York"))
d_string = d.strftime(fmt)
d2 = datetime.datetime.strptime(d_string, fmt)
print d_string 
print d2.strftime(fmt)

출력은이다.

2013-02-07 17:42:31 EST
2013-02-07 17:42:31 

시간대 정보가 단순히 번역에서 손실되었습니다.

'% z'를 '% z'로 전환하면

ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

나는 python-dateutil을 사용할 수 있다는 것을 알고 있지만 datetime에서이 간단한 기능을 수행 할 수없고 더 많은 의존성을 도입해야한다는 사실을 알게되었습니다.

해결법

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

    1.여기서 문제의 일부는 일반적으로 시간대를 나타내는 데 사용되는 문자열이 실제로 고유하지 않다는 것입니다. "EST"는 북미 사람들에게만 "America / New_York"을 의미합니다. 이것은 C 시간 API의 한계이며, Python 솔루션은 ... 누군가가 PEP를 기꺼이 쓸 수 있다면 어떤 미래의 버전에서든 완전한 tz 기능을 추가 할 수 있습니다.

    여기서 문제의 일부는 일반적으로 시간대를 나타내는 데 사용되는 문자열이 실제로 고유하지 않다는 것입니다. "EST"는 북미 사람들에게만 "America / New_York"을 의미합니다. 이것은 C 시간 API의 한계이며, Python 솔루션은 ... 누군가가 PEP를 기꺼이 쓸 수 있다면 어떤 미래의 버전에서든 완전한 tz 기능을 추가 할 수 있습니다.

    시간대를 오프셋으로 형식을 지정하고 구문 분석 할 수는 있지만 일광 절약 시간 / 여름 시간 정보가 손실됩니다 (예 : 'America / Phoenix'를 여름에 'America / Los_Angeles'와 구분할 수 없음). 시간대는 3 자의 약어로 지정할 수 있지만 그걸 다시 파싱 할 수는 없습니다.

    희미하고 모호한 것이지만 보통 원하는 것을 원하면 dateutil과 같은 타사 라이브러리가 필요합니다.

    실제로 모호한 것을 원한다면 로컬 datetime 문자열에 실제 tz 이름을 추가하고 다른 끝에서 다시 분리하십시오.

    d = datetime.datetime.now(pytz.timezone("America/New_York"))
    dtz_string = d.strftime(fmt) + ' ' + "America/New_York"
    
    d_string, tz_string = dtz_string.rsplit(' ', 1)
    d2 = datetime.datetime.strptime(d_string, fmt)
    tz2 = pytz.timezone(tz_string)
    
    print dtz_string 
    print d2.strftime(fmt) + ' ' + tz_string
    

    또는 그 둘 사이의 중간에, 이미 "EST"와 같은 형식을 구문 분석 할 수있는 pytz 라이브러리를 사용하고 있습니다. 그래서, 정말로 원한다면, % Z를 포맷팅면에 남겨두고, 나머지 부분을 strptime에 전달하기 전에 pytz.timezone ()으로 구문 분석하여 파싱하십시오.

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

    2.안타깝게도 strptime ()은 OS가 설정 한 시간대 만 처리 할 수 ​​있으며 실제로는 시간 오프셋으로 처리 할 수 ​​있습니다. 문서에서 :

    안타깝게도 strptime ()은 OS가 설정 한 시간대 만 처리 할 수 ​​있으며 실제로는 시간 오프셋으로 처리 할 수 ​​있습니다. 문서에서 :

    strftime ()은 % z를 공식적으로 지원하지 않습니다.

    Python-Dateutil을 사용하여 시간대 파싱을 지원해야합니다.

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

    3.파이썬 2.7에서 내 대답은 다음과 같습니다.

    파이썬 2.7에서 내 대답은 다음과 같습니다.

    from datetime import datetime
    import tzlocal  # pip install tzlocal
    
    print datetime.now(tzlocal.get_localzone()).strftime("%Y-%m-%d %H:%M:%S %z")
    
    from datetime import datetime
    import pytz # pip install pytz
    
    print datetime.now(pytz.timezone('Asia/Taipei')).strftime("%Y-%m-%d %H:%M:%S %z")
    

    그것은 뭔가를 인쇄 할 것입니다.

    2017-08-10 20:46:24 +0800
    
  4. from https://stackoverflow.com/questions/14762518/python-datetime-strptime-and-strftime-how-to-preserve-the-timezone-informat by cc-by-sa and MIT license