기록과 정리의 공간

[Python] 시간 다루기 헷갈리는 부분 정리 본문

언어/Python

[Python] 시간 다루기 헷갈리는 부분 정리

딸기맛도나쓰 2020. 7. 30. 16:41

0. UTC시간이란?

  • 참고 : 링크
  • UTC시간의 기준이 되는 나라는 영국의 런던으로, 런던을 기준으로 +, -로 나타낸다.
  • 우리나라는 런던을 기준으로 +9이다.
  • UTC와 GMT는 소수점 차이만 있을 뿐 큰 차이가 없어 혼용해서 사용하기도 한다.

1. 타임스탬프란?

  • 참고 : 링크
  • 운영제체 별로 날짜/시간을 표현하는 방식이 다르다.
  • 윈도우 : 1601-01-01 00:00:00 부터 현재 시간까지 몇 100ns 떨어져 있는지를 8바이트로 나타낸다.
  • 유닉스와 리눅스 : 1970-01-01 00:00:00부터 현재 시간까지의 초를 누적한 시간을 사용한다.
  • 이렇게 표현되는 시간을 타임스탬프라고 한다.

2. time.time()

  • 참고 : time모듈 관련 링크

  • time모듈의 time은 UTC를 사용하여 현재 시각을 실수 형태로 반환하는 함수인데, 1970년 1월 1일 0시 0분 0초를 기준으로 초 단위로 지난 시간을 알려준다.

from time import time

now_timestamp = time.time()
print(now_timestamp) # 1596094416.9727871

3. datetime.fromtimestamp() / datetime.utcfromtimestamp()

  • 참고 : 링크

  • datetime모듈의 datetime객체의 fromtimestamp()함수에 인자로 time.time()을 넘겨주면 현재 시간을 datetime객체로 변환해준다.

  • utcfromtimestamp()함수에 time.time()을 넘겨주면 utc시간 객체로 반환해준다.

from datetime import datetime

print(datetime.fromtimestamp(now_timestamp)) # 2020-07-30 16:33:36.972787
print(datetime.utcfromtimestamp(now_timestamp)) # 2020-07-30 07:33:36.972787
  • 위 코드에서 볼 수 있듯이 9시간 차이가 나는 것을 확인할 수 있다.

  • 시간 차이 = datetime형 현재 시간 - datetime형 UTC시간

4. 웹 프로그래밍 시 게시물 작성 시간 구하는 것에 활용하기

  • 참고 : 링크

  • 게시물 작성 시간을 DB넣을 때는 이후에 상황에 맞게 가공하기 쉬운 형태로 넣는 것이 좋다.

  • 따라서, timestamp()를 이용해 타임스탬프형식으로 넣는 것이 좋다.

  • #1 : datetime.utcnow()는 현재의 utc시간을 반환한다. datetime.utcnow().timestamp()를 반환하므로 이를 밀리초단위로 변환해주기 위해 1000을 곱하고 소숫점을 없애기 위해 round()를 사용했다.

  • #2 : DB에는 이와 같은 형태로 작성 시간이 저장됨

  • #3 : strftime()(참고 링크)을 이용해 시간 정보 객체를 원하는 양식으로 양식화 한다.

# DB에 넣을 때 : # 2와 같은 형태로 작성시간을 넣어줌

from datetime import datetime
import time

current_utc_time = round(datetime.utcnow().timestamp() * 1000) # 1
print(current_utc_time) # 2 1596072314247
# 참고 : print(datetime.utcnow()) 값은 2020-07-30 10:25:14.246619 (한국 시간으로는 2020-07-30 19:25:14.246619)
# 1596072314247(글 작성시간)을 가공하기

from datetime import datetime
import time

value = 1596072314247
now_timestamp = time.time()
offset = datetime.fromtimestamp(now_timestamp) - datetime.utcfromtimestamp(now_timestamp)
value = datetime.fromtimestamp(int(value / 1000)) + offset # 1000을 나누는 이유는 밀리초를 다시 초로 변환하기 위함
print(value.strftime('%Y-%m-%d %H:%M:%S')) # 3 2020-07-30 19:25:14
Comments