[PYTHON] 파이썬 : 로컬 타임 존을 찾아냅니다.
PYTHON파이썬 : 로컬 타임 존을 찾아냅니다.
로컬 타임 스탬프와 로그 파일의 UTC 타임 스탬프를 비교하고 싶습니다. 로컬 datetime 객체를 만들 때 다음과 같은 것을 사용합니다.
>>> local_time=datetime.datetime(2010, 4, 27, 12, 0, 0, 0,
tzinfo=pytz.timezone('Israel'))
나는 thetzinfo = pytz.timezone ( 'Israel')을 현재 지역 시간대로 대체 할 수있는 자동 도구를 찾고 싶습니다.
어떤 아이디어?
해결법
-
==============================
1.필요한 것을 수행하는 tzlocal 유형의 dateutil을 시도하십시오.
필요한 것을 수행하는 tzlocal 유형의 dateutil을 시도하십시오.
-
==============================
2.파이썬 3.x에서 지역 시간대는 다음과 같이 계산할 수 있습니다 :
파이썬 3.x에서 지역 시간대는 다음과 같이 계산할 수 있습니다 :
import datetime LOCAL_TIMEZONE = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
datetime 코드를 사용하는 것은 까다 롭습니다.
-
==============================
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.나는 나에게도 똑같은 질문을하고 있었고 나는 그 대답을 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.먼저 pytz 모듈과 tzlocal 모듈을 얻습니다.
먼저 pytz 모듈과 tzlocal 모듈을 얻습니다.
pytz tzlocal을 설치하십시오.
그때
from tzlocal import get_localzone local = get_localzone()
다음과 같은 일을 할 수 있습니다.
from datetime import datetime print(datetime.now(local))
-
==============================
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.J. F. Sebastian의 답을 바탕으로 표준 라이브러리로 이것을 할 수 있습니다 :
J. F. Sebastian의 답을 바탕으로 표준 라이브러리로 이것을 할 수 있습니다 :
import time, datetime local_timezone = datetime.timezone(datetime.timedelta(seconds=-time.timezone))
3.4에서 테스트되었습니다. 3.4 이상에서 작동해야합니다.
-
==============================
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.비표준 모듈 피하기 (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.위의 Thoku의 답을 바탕으로 시간대를 가장 가까운 30 분 (예 : 남호주의 시간대와 관련이 있음)으로 결정하는 대답은 다음과 같습니다.
위의 Thoku의 답을 바탕으로 시간대를 가장 가까운 30 분 (예 : 남호주의 시간대와 관련이 있음)으로 결정하는 대답은 다음과 같습니다.
from datetime import datetime round((round((datetime.now()-datetime.utcnow()).total_seconds())/1800)/2)
-
==============================
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.먼저,이 질문은 알고있는 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.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' >>>
from https://stackoverflow.com/questions/2720319/python-figure-out-local-timezone by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python 3, ast.literal_eval (node_or_string)에 알려진 보안 구멍이 있습니까? (0) | 2018.11.08 |
---|---|
[PYTHON] 문자열의 일부로 문자열 목록 정렬 (0) | 2018.11.08 |
[PYTHON] 범위가 너무 큽니다. Python (0) | 2018.11.07 |
[PYTHON] python에서 sympy를 사용하여 표현식을 계산하는 방법 (0) | 2018.11.07 |
[PYTHON] SQLAlchemy : 날짜 필드를 필터링하는 방법? (0) | 2018.11.07 |